Python 异常处理
当检测到⼀个错误时,解释器就⽆法继续执⾏了,反⽽出现了⼀些错误的提示,这就是所谓的"异常"。
- 异常即是一个事件,该事件在程序执行过程中发生,会影响程序的正常执行。
- 异常是Python对象,表示一个错误。一般情况下,在Python无法正常处理程序时就会发生一个异常。
- 当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。
异常处理
常见的异常和描述
| 异常名称 | 描述 |
|---|---|
| StopIteration | 迭代器没有更多的值 |
| ZeroDivisionError | 除(或取模)零 (所有数据类型) |
| AttributeError | 对象没有这个属性 |
| OSError | 操作系统错误 |
| ImportError | 导入模块/对象失败 |
| IndexError | 序列中没有此索引(index) |
| KeyError | 没有这个键 |
| NameError | 未声明/初始化对象 (没有属性) |
| SyntaxError | Python 语法错误 |
| TypeError | 对类型无效的操作 |
| ValueError | 传入无效的参数 |
| Warning | 警告的基类 |
要处理异常,先要捕获异常。
Python 中使用 try...except...来捕获和处理异常。
- Python会检测 try 中的代码块,如果有异常,会跳转到匹配该异常的 except 语句,并把异常对象交给except处理,处理完后,程序继续执行;
- 如果没有匹配对应异常except语句,程序还是会终止,无法继续执行。
需要注意的是,语法错误SyntaxError无法被捕获处理。
(1)try...except...
try: 可能发送异常的语句 except: 处理异常的语句
示例1:
try: print(a) except NameError as e: # except 异常 as 别名 如果直接写except:则表示捕获所有异常 print(e) # name 'a' is not defined
try: print('a' + 1) # TypeError: can only concatenate str (not "int") to str except NameError as e: # 由于try中的语句抛出的是TypeError异常,这里匹配的是NameError异常,没有匹配上,因此上述代码还是抛出异常 print(e)
示例2:
try: print('a' + 1) # except NameError as e: # try中语句抛出的是TypeError异常,不匹配,该except中的代码不会执行 print(e) print('捕获到 NameError') except TypeError as e: # 匹配到异常,执行该except中的代码 print(e) # can only concatenate str (not "int") to str print('捕获到 TypeError') # 捕获到 TypeError
(2)异常处理的else
try...except...else...
else 表示的是如果没有异常要执⾏的代码。
try: 可能发生异常的代码 except: 捕获到异常后要执行的代码 else: 没有发生异常会执行的代码
try: print(1 + 1) # except: # 匹配所有异常,也就是说只要发生了异常就会执行该except中的代码 print('捕获到异常') # 没有发生异常,该代码不会执行 else: # try中语句正常执行完未发生异常,因此会执行else中的语句 print('未发生异常') # 未发生异常
(3)异常处理的finally
类似else,但finally中的语句无论是否发送异常,无论异常是否被捕获到,都会执行。
try: 可能发送异常的代码 except 异常: 捕获异常要执行的代码 finally: 是否发生异常,异常是否被捕获,最终都会执行的代码
try: print(1 + a) # except TypeError: # 未匹配到异常 print('捕获到异常') # 虽然发生了异常,但并未捕获到,不会执行 else: # try中语句发生异常,else中的代码不会执行 print('未发生异常') finally: print('我一定会被执行') # 我一定会被执行 虽然发生了异常并未被捕获到,但本行代码还是会执行
try: print(1 + 1) # 2 except TypeError: # print('捕获到异常') # 没有发生异常,该代码不会执行 else: # try中语句正常执行,else中的代码会执行 print('未发生异常') # 未发生异常 finally: print('我一定会被执行') # 我一定会被执行
(4)自定义异常
如果觉得内置的异常类型不能满足需求,可以自定义异常类。
自定义异常类必须继承Exception类。使用 raise 异常类 来抛出异常
class MyException(Exception): def __init__(self, info): self.info = info def __str__(self): return f'{self.info}' def func1(): a = input('请输入整数:') if a.isdigit(): print('%s的平方是:%s' % (a, int(a) ** 2)) else: raise MyException(f'【{a}】不是整数') # raise 异常类对象 表示抛出异常 try: func1() # 执行func1(),输入 abc except MyException as e: print(e) # 打印出自定义异常信息【aa】不是整数 else: print('没捕捉到自定义的异常')
为了更好的处理异常,自定义异常类一般要实现__init__() 和__str__()这2个魔术方法。
浙公网安备 33010602011771号