Python 异常处理

 

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
'''

 

转载于:https://www.cnblogs.com/bw13/p/5919409.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值