python基础_try...except...finally
1、为什么要有错误处理机制?
在程序运行过程中,总会遇到各种各样的错误,有了错误处理机制,可以帮助我们捕获错误信息,然后分析错误原因,同时让程序继续执行下去。
2、python 中的错误处理机制
python 语言中 通过try...except...finally...
在try中运行可能出错的代码段,如果出错,则不会继续执行出错位置后面的代码,而是直接跳转至except 语句块中,执行excpet中的代码,执行完毕后如果还有finally 则继续执行finally中的代码
常见的格式如下:
try: '''可能出错的代码段''' except Exception : raise #将错误抛出 finally: '''执行完except 后 会执行这里'''
3、一个常见的例子:
class base: def f1(self): print('执行f1') def f2(self): print('执行f2') def f3(self): func_list = {'f1':self.f1,'f2':self.f2} while True: try: choice = input('请输入要执行的方法:') func = func_list.get(choice) print('try 出错之前还会执行') func() print('出错的位置之后不会执行') except ValueError as e: print('ValueError') raise e except TypeError: print('TypeError') raise #捕获这个异常对象,赋值给e except Exception : print('Exception') raise finally: print('有finally则必定会执行') b = base() b.f3() ''' 执行结果: 请输入要执行的方法:f5 try 出错之前还会执行 TypeError 有finally则必定会执行 Traceback (most recent call last): File "D:/pythonProject/PyDemo/DemoFile/捕获异常/捕获异常3.py", line 35, in <module> b.f3() File "D:/pythonProject/PyDemo/DemoFile/捕获异常/捕获异常3.py", line 16, in f3 func() TypeError: 'NoneType' object is not callable Process finished with exit code 1 '''
过程分析:
1、输入f5, 在func_list中获取key为f5的值,返回一个None 赋值给 func
2、在执行func() 执行的时候 报错,因为func 此时为None ,不是一个可执行的对象,代码运行至此的时候 ,python内置函数会抛出 一个 TypeError 类型 的一个错误对象,
3、这个错误对象被 后面的 except TypeError 并执行 这个异常捕获中的语句块:打印 TypeError 最后抛出 错误对象 except 执行完毕
4、except 执行完毕后,后面还有finally,执行finally 语句中的代码 至此代码运行完毕
注意:在python 中异常捕获 是按照代码中定义的except顺序 去捕获对应的异常,例子中的顺序是:ValueError TypeError Exception , 只要捕获到了其中某一个异常,这后续异常不再继续捕获
4、自定义类型的异常:
在python 一切皆对象,错误也不例外, 捕获一个错误实际上就是 捕获 该错误类型的一个实例,因此,错误并不是凭空产生的,而是有意创建并抛出的。Python的内置函数会抛出很多类型的错误,我们自己编写的函数也可以抛出错误。
如果要抛出错误,首先根据需要,可以定义一个错误的class,选择好继承关系,然后,用raise语句抛出一个错误的实例:
# # 定义一个自定义类的异常 class ValueNotfind(Exception): '''当输出有误时,抛出此异常''' # 自定义异常类型的初始化 def __init__(self,value): self.value = value # 返回异常类对象的说明信息 def __str__(self): return ("{} 是非法的输入项".format(repr(self.value))) def f3(): func_list = ['f1', 'f2', 'f3'] while True: try: choice = input('请输入要执行的方法:') if choice not in func_list: # 当输入的值不在list中的时候 抛出这个异常 <抛出的是自定义类的对象> raise ValueNotfind(choice) else: print('当前选择的是{}'.format(choice)) #捕获这个异常类,这里的e其实是这个异常类的实例对象 except ValueNotfind as e: # print(e.value) #还可以获取到 对象的实例变量相关 信息 raise e #抛出异常对象 即__str__里的内容 #最后一般Exception 兜底 except Exception as e1: print(e1) else: print('没有异常则会执行else中的这条语句') finally: print('如果有finally 则一定会执行finally中的语句') f3() ''' 输入f4执行结果如下: 请输入要执行的方法:f4 如果有finally 则一定会执行finally中的语句 Traceback (most recent call last): File "D:/pythonProject/PyDemo/DemoFile/捕获异常/捕获异常_自定义异常类.py", line 34, in <module> f3() File "D:/pythonProject/PyDemo/DemoFile/捕获异常/捕获异常_自定义异常类.py", line 25, in f3 raise e #抛出异常对象 即__str__里的内容 File "D:/pythonProject/PyDemo/DemoFile/捕获异常/捕获异常_自定义异常类.py", line 19, in f3 raise ValueNotfind(choice) __main__.ValueNotfind: 'f4' 是非法的输入项 Process finished with exit code 1 '''
过程:
1、先定义一个类,运行代码时,在指定条件下 把这个错误类的实例对象抛出
2、通过except 捕获后再进行后续处理
特别注意:
1、raise语句抛出的是一个错误的实例
2、except 捕获的时候 ValueNotfind as e: 这里的变量e 其实也是 这个错误的实例
3、捕获异常的时候 可以在最后捕获 Exception 表示捕获所有类型异常 (用于兜底)

浙公网安备 33010602011771号