29:异常处理
-
什么是异常
-
异常处理
-
何时使用异常处理
内容详细
1 什么是异常
异常是程序发生错误的信号
程序一旦出现错误,便会产生一个异常,若程序中没有处理它,就会抛出该异常,程序的运行也随之终止
而错误分为两种:
1 是语法上的错误syntaxerror,这种错误应该在程序运行前就修改正确
>>> if File "<stdin>", line 1 if ^ SyntaxError: invalid syntax
2 是逻辑错误,常见的逻辑错误如:
# TypeError:数字类型无法与字符串类型相加 1+’2’ # ValueError:当字符串包含有非数字的值时,无法转成int类型 num=input(">>: ") #输入hello int(num) # NameError:引用了一个不存在的名字x x # IndexError:索引超出列表的限制 l=['egon','aa'] l[3] # KeyError:引用了一个不存在的key dic={'name':'egon'} dic['age'] # AttributeError:引用的属性不存在 class Foo: pass Foo.x # ZeroDivisionError:除数不能为0 1/0
2 异常处理
为了保证程序的容错性与可靠性 ---> 在遇到错误时有相应的处理机制不会任由程序崩溃 ---> 需要对异常进行处理
处理的基本形式为:
try: 被检测的代码块 except 异常类型 检测到异常,就执行这个位置的逻辑 例如: try: print('start...') print(x) # 引用了一个不存在的名字,触发异常NameError print('end...') except NameError as e: # as语法将异常类型的值赋值给变量e,这样我们通过打印e便可以知道错误的原因 print('异常值为:%s' %e) print('run other code...') #执行结果为 start... 异常值为:name 'x' is not defined run other code...
========================================================================================
本来程序一旦出现异常即整体结束掉了,但有了异常处理以后:
在被检测的代码块出现异常时:
1 被检测的代码块中异常发生位置之后的代码将不会继续执行
2 取而代之的是执行匹配异常的except子代码块,其余代码均正常运行
当被检测的代码块中有可能触发不同类型的异常时,针对不同类型的异常:
如果我们想分别用不同的逻辑处理,则需要用到多分支的except(类似于多分支的elif,从上到下依次匹配,匹配成功依次便不再匹配其他)
try: 被检测的代码块 except NameError: 触发NameError时对应的处理逻辑 except IndexError: 触发IndexError时对应的处理逻辑 except KeyError: 触发KeyError时对应的处理逻辑
例如:
def convert_int(obj): try: res=int(obj) except ValueError as e: print('ValueError: %s' %e) res=None except TypeError as e: print('TypeError: %s' %e) res=None return res convert_int('egon') # ValueError: invalid literal for int() with base 10: 'egon' convert_int({'n':1}) # TypeError: int() argument must be a string, a bytes-like object or a number, not 'dict'
========================================================================================
如果想多种类型的异常统一用一种逻辑处理,可以将多个异常放到一个元组内,用一个except匹配
try: 被检测的代码块 except (NameError,IndexError,TypeError): 触发NameError或IndexError或TypeError时对应的处理逻辑 例如: def convert_int(obj): try: res=int(obj) except (ValueError,TypeError): print('argument must be number or numeric string') res=None return res convert_int('egon') # argument must be number or numeric string convert_int({'n':1}) # argument must be number or numeric string
如果我们想捕获所有异常并用一种逻辑处理,Python提供了一个万能异常类型Exception
try: 被检测的代码块 except NameError: 触发NameError时对应的处理逻辑 except IndexError: 触发IndexError时对应的处理逻辑 except Exception: 其他类型的异常统一用此处的逻辑处理