Python内置了一套try...except...finally...
的错误处理机制
格式为
1 try: 2 # 代码块,出现错误立即停止执行 3 4 5 except Exception as e: 6 # 出现错误执行这里的内容 7 # e是Exception对象,对象中封装了错误信息 8 9 else: 10 # 不出现错误,执行这里的内容(可没有)、 11 12 finally: 13 # 不管初步出现错误,最后执行这里内容(可没有)
其中的Exception可以换成各种错误类型,当出现指定种类的错误时就会执行except下的语句,所以可以有多个except语句
Exception代表所有的错误
1 def fun(): 2 ret = 0 3 try: 4 li = [11, 22] 5 li[1] 6 int('w3r') 7 8 except IndexError as e: 9 print('IndexError',e) 10 except ValueError as e: 11 print('ValueError',e) 12 except Exception as e: 13 print('Exception',e) 14 else: 15 ret = 1 16 print('elese') 17 finally: 18 print('....') 19 20 return ret 21 r = fun() 22 if r == 0: 23 print('500') 24 else: 25 pass
错误也是类
Python的错误也是类,所以当父类的错误在子类的上面时,就无法触发子类的except
try: foo() except ValueError as e: print('ValueError') except UnicodeError as e: print('UnicodeError')
第二个except永远也捕获不到UnicodeError ,因为UnicodeError是ValueError的子类
使用try...except
捕获错误还有一个巨大的好处,就是可以跨越多层调用,比如函数main()
调用foo()
,foo()
调用bar()
,结果bar()
出错了,这时,只要main()
捕获到了,就可以处理:
1 def foo(s): 2 return 10 / int(s) 3 4 def bar(s): 5 return foo(s) * 2 6 7 def main(): 8 try: 9 bar('0') 10 except Exception as e: 11 print('Error:', e) 12 finally: 13 print('finally...')
也就是说,不需要在每个可能出错的地方去捕获错误,只要在合适的层次去捕获错误就可以了。这样一来,就大大减少了写try...except...finally
的麻烦。
raise:主动触发异常
语句 raise Exception()
try: int('asdf') # 主动触发异常 raise Exception('不过了...') except Exception as e: print(e)
由于错误也是类,所以可以自己创建错误
1 class OldBoyError(Exception): 2 3 def __init__(self, msg): 4 self.message = msg 5 6 def __str__(self): 7 return self.message 8 9 # obj = OldBoyError('xxx') 10 # print(obj) 11 try: 12 d = int(0) 13 raise OldBoyError('我错了...') 14 except OldBoyError as e: 15 print(e) # e对象的__str__()方法,获取返回
raise
语句如果不带参数,就会把当前错误原样抛出。
1 def foo(s): 2 n = int(s) 3 if n == 0: 4 raise ValueError('invalid value: %s' % s) 5 return 10 / n 6 7 8 def bar(): 9 try: 10 foo('0') 11 except ValueError as e: 12 print('ValueError!') 13 raise 14 15 bar()
输出为
Traceback (most recent call last): ValueError! File "C:/Users/wg/PycharmProjects/fullstack_s2/week6/day3/test2.py", line 15, in <module> bar() File "C:/Users/wg/PycharmProjects/fullstack_s2/week6/day3/test2.py", line 10, in bar foo('0') File "C:/Users/wg/PycharmProjects/fullstack_s2/week6/day3/test2.py", line 4, in foo raise ValueError('invalid value: %s' % s) ValueError: invalid value: 0
assert: 断言
用于让用户强制服从其后面的条件,不服从就报错
如
print(23) assert 1 == 2, "1不是2" # 可跟参数 print(456) ### # 输出为 ''' 23 Traceback (most recent call last): File "C:/Users/wg/PycharmProjects/fullstack_s2/week6/day3/test2.py", line 2, in <module> assert 1 == 2, "1不是2" AssertionError: 1不是2 '''