这一篇教程,我们来了解异常的处理。
编写的代码出现异常的情况十分常见,例如下面这段代码。
示例代码:(零除异常)
def get_error(): print(1 / 0) get_error()
异常信息:
Traceback (most recent call last): # 回溯(最近一次命令) File "D:/MyProject/case.py", line 5, in <module> # 文件"所在路径",位于第2行,模块内 get_error() # 出错的函数名称 File "D:/MyProject/case.py", line 3, in get_error # 文件"所在路径",位于第3行,get_error方法中 print(1 / 0) # 出错的语句 ZeroDivisionError: division by zero # 0除错误:除数为0
异常信息中,我做了中文标注,应该很容易看懂。
当发生异常时,程序捕捉到这个异常显示出来,并且按从外到内的顺序给出了不同层级出错的位置。
这是程序给我们自动抛出的异常信息。
在Python中内置的异常有很多,见下表:(简单看看即可)
BaseException # 所有异常的超类
+-- SystemExit # 解释器退出错误
+-- KeyboardInterrupt # 键盘中断执行错误
+-- GeneratorExit # 生成器错误
+-- Exception # 所有标准异常的超类
+-- StopIteration # 停止迭代错误
+-- StopAsyncIteration # 停止异步迭代错误
+-- ArithmeticError # 计算错误
| +-- FloatingPointError # 浮点计算错误
| +-- OverflowError # 数值溢出错误
| +-- ZeroDivisionError # 零除错误
+-- AssertionError # 断言失败错误
+-- AttributeError # 特性错误
+-- BufferError # 缓冲错误
+-- EOFError # EOF标记错误
+-- ImportError # 导入错误
+-- ModuleNotFoundError # 模块不存在错误
+-- LookupError # 查询错误
| +-- IndexError # 索引错误
| +-- KeyError # 键错误
+-- MemoryError # 内存错误
+-- NameError # 标识符错误
| +-- UnboundLocalError # 未绑定局部变量错误
+-- OSError # 操作系统错误
| +-- BlockingIOError # 阻塞输入输出错误
| +-- ChildProcessError # 子进程错误
| +-- ConnectionError # 连接错误
| | +-- BrokenPipeError # 管道中断错误
| | +-- ConnectionAbortedError # 连接失败错误
| | +-- ConnectionRefusedError # 连接拒绝错误
| | +-- ConnectionResetError # 连接重置错误
| +-- FileExistsError # 文件已存在的错误
| +-- FileNotFoundError # 文件未发现的错误
| +-- InterruptedError # 中断错误
| +-- IsADirectoryError # 目标为目录的错误
| +-- NotADirectoryError # 目录不存在的错误
| +-- PermissionError # 许可错误
| +-- ProcessLookupError # 进程查询错误
| +-- TimeoutError # 超时错误
+-- ReferenceError # 引用错误
+-- RuntimeError # 运行时错误
| +-- NotImplementedError # 未执行错误
| +-- RecursionError # 递归错误
+-- SyntaxError # 语法错误
| +-- IndentationError # 缩进错误
| +-- TabError # Tab错误
+-- SystemError # 系统错误
+-- TypeError # 类型错误
+-- ValueError # 值错误
| +-- UnicodeError # Unicode相关错误
| +-- UnicodeDecodeError # Unicode解码错误
| +-- UnicodeEncodeError # Unicode编码错误
| +-- UnicodeTranslateError # Unicode转换错误
+-- Warning # 警告的超类
+-- DeprecationWarning # 关于弃用功能的警告
+-- PendingDeprecationWarning # 关于功能将被弃用的警告
+-- RuntimeWarning # 关于可疑运行时行为的警告
+-- SyntaxWarning # 关于可疑语法的警告
+-- UserWarning # 关于由用户代码生成的警告
+-- FutureWarning # 关于构造将在语义上有改变的警告
+-- ImportWarning # 关于模块导入中可能出现错误的警告
+-- UnicodeWarning # 关于Unicode的警告
+-- BytesWarning # 关于字节和字节数组的警告
+-- ResourceWarning # 关于资源使用的警告
当异常出现时,系统会给出相应的异常信息。
不过,这些系统给出的异常信息有些艰涩难懂,不够友好。
那么,能不能显示自定义的异常信息呢?
引发异常:raise 语句
我们可以使用raise 语句,显式的引发异常。
示例代码:
num1 = input('请输入被除数:') num2 = input('请输入除数:') if int(num2) == 0: raise ZeroDivisionError('除数不能为零!')
通过异常类可以调用raise语句,此时我们可以为异常类指定显示的异常信息。
当我们运行代码,输入1和0回车之后,就会显示出异常。
Traceback (most recent call last): File "D:/MyProject/case.py", line 5, in <module> raise ZeroDivisionError('除数不能为零!') ZeroDivisionError: 除数不能为零!
这样虽然能够引发异常,也能给出提示,但是需要我们自己来判断输入的内容。
并且,异常信息还不是很友好,至少我想让异常类型也是中文,我也不想看到除了最后一句提示之外的信息。
捕捉异常:try/except 语句
接下来,我们采用科学的方法捕捉可能发生的异常,并在捕捉到异常时进行处理。
示例代码:
while True: try: num1 = int(input('请输入被除数:')) num2 = int(input('请输入除数:')) print('计算结果为:', num1 / num2) except ZeroDivisionError: print('零除错误:除数不能为零!')
当我们运行代码,输入1和0回车之后,这时显示了我们在print语句中输入的提示内容。
try和except语句之间,我们要写入可能会发生异常的语句块,一旦发生指定的异常(except语句中的异常类所对应的异常)就会被except语句捕捉到,然后,在except语句下方可以进行处理。
当然,我们输入的内容也可能不是数值,这个时候怎么将值异常也捕捉到呢?我们可以再加入一个except语句进行捕捉。
示例代码:
except ZeroDivisionError: print('零除错误:除数不能为零!') except ValueError: print('数值错误:必须输入数字!')
但是,如果我们想不管是0除错误,还是输入值的错误都给一个共同的提示,怎么处理呢?
我们可以通过except语句捕捉多个异常,然后进行相同的处理。
示例代码:
except (ZeroDivisionError,ValueError): print('错误提示:请输入正确的数值!')
还有,如果不想做什么处理,还是显示系统异常信息又怎么处理呢?
还是使用raise语句,不带任何参数即可。
示例代码:
except (ZeroDivisionError,ValueError): raise
另外,如果我们不想让程序终止,也要显示异常信息呢?
我们可以把捕捉到的异常通过as关键字存入变量,然后显示输出这个变量。
示例代码:
except (ZeroDivisionError,ValueError) as record: print(record)
有的时候,我们不知道都会发生什么异常,可以在except语句后方什么都不添加。
示例代码:
except: print('发生了一些错误,但不知道是什么!')
不过这样显然不可取,我们还是希望知道发生了什么?
那就用标准异常的超类帮我们获取所有的异常。
示例代码:
except Exception as e: print(e)
这样就能捕获到所有的异常,并且把相应的异常信息显示出来。
除了这些操作,还有这样的操作!
一旦输入错误,我们提示用户,并且重新获取输入,指导输入正确,给出计算结果,
示例代码:
while True: try: num1 = int(input('请输入被除数:')) num2 = int(input('请输入除数:')) print('计算结果为:',num1 / num2) except Exception as e: print(e) else: break
在上方代码中,我们加入了while循环,并且加入了else子句,这样只要是异常出现就会不停执行try中的语句块,直到输入正确,不再发现异常。这时,会执行else中的语句块,跳出循环。
异常收尾:finally 语句
最后,还有一个内容。
比如,不管程序有没有正确执行,我们都想提示用户当前程序进行了一次计算。
示例代码:
count = 0 while True: try: num1 = int(input('请输入被除数:')) num2 = int(input('请输入除数:')) print('计算结果为:', num1 / num2) except Exception as e: print(e) else: break finally: count += 1 print('第%d次计算完毕!' % count)
我们在程序的开始定义了一个全局变量count,不管计算是否有异常出现,我们都在finally中进行计数的递增,并显示输出提示。
本节知识点:
1、异常列表
2、引发异常
3、捕捉异常
4、异常收尾
本节英文单词与中文释义:
1、traceback:回溯
2、most:最
3、zero:零
4、division:除法
5、recent:最近
6、last:最后
7、call:命令
8、raise:引发
9、except/exception:例外/异常
10、finally:最后
转载请注明:魔力Python » Python3萌新入门笔记(30)