文章目录
- 1. 简介
- 2. 安装以及使用过程
- 3. 测试对比
- 4. pretty_errors 的个性化使用
- 5. Python 异常类型样例
- 5.1 Python 有哪些异常类型
- 5.2 部分异常类型介绍[^1]
- SystemExit
- KeyboardInterrupt
- StopIteration
- OverflowError
- ZeroDivisionError
- AssertionError
- AttributeError
- BufferError
- EOFError
- ImportError
- ModuleNotFoundError
- IndexError
- KeyError
- MemoryError
- NameError
- UnboundLocalError
- BlockingIOError
- ChildProcessError
- FileExistsError
- FileNotFoundError
- InterruptedError
- IsADirectoryError
- NotADirectoryError
- PermissionError
- ProcessLookupError
- TimeoutError
- RuntimeError
- RecursionError
- SyntaxError
- IndentationError
- TabError
- SystemError
- TypeError
- ValueError
1. 简介
大家好,我是 Jia ming,今天为大家带来一个超简单的 Python 模块 —— pretty_errors1。它的作用是什么呢?美化 Python 异常输出以使其清晰可读。
简单来说,如下图所示,它可以将繁杂冗长的错误输出凝练出核心信息给您,让您立马就知道错误是什么,在哪里。
2. 安装以及使用过程
正如其它模块一样,该模块的安装过程十分简单:python -m pip install pretty_errors。
使用过程也是十分简单,只需要 import 该模块即可,如下所示:
测试代码:
import pretty_errorsprint(1/0)
报错信息:
tmp.py 2 <module>print(1/0)
ZeroDivisionError:
division by zero
3. 测试对比
当不使用 pretty_errors 模块时,会得到如下结果。
测试代码:
print(1/0)报错信息:
PS D:\Python_Project> & D:/Python35/python.exe d:/Python_Project/tmp.pyTraceback (most recent call last):
File "d:/Python_Project/tmp.py", line 1, in <module>
print(1/0)
ZeroDivisionError: division by zero
两厢对比,该模块确实能够带来不少美化效果,值得一用。
4. pretty_errors 的个性化使用
重点介绍 pretty_errors.configure 语句的作用,先看如下样例:
测试代码,建议结合之后的报错截图食用:
import pretty_errorspretty_errors.configure(
separator_character = '*', # 用于创建标题行的字符,如果设置为None或者''则标题被禁用,之后的报错信息截图中可以理解该设置的意义。
filename_display = pretty_errors.FILENAME_EXTENDED, # 如何显示文件名,可以是pretty_errors.FILENAME_COMPACT、pretty_errors.FILENAME_EXTENDED、pretty_errors.FILENAME_FULL
line_number_first = True, # 启用后,将首先显示行号,而不是文件名,二者会交换位置
display_link = True, # 启用后,错误下方会写入一个链接,VSCode允许您单击该链接。
lines_before = 5, # 显示发生异常的语句之前5行代码
lines_after = 2, # 显示发生异常的语句之后2行代码
line_color = pretty_errors.RED + '> ' + pretty_errors.default_config.line_color, # 转移序列设置导致异常的代码行的颜色
code_color = ' ' + pretty_errors.default_config.line_color, # 用于设置导致异常的代码行的颜色。
truncate_code = True, # 启用后,每行代码都将被截断显示
display_locals = True # 启用后,出现在顶部堆栈帧代码中的局部变量将与其值一起显示。
)
def func():
print(1/0)
func()
# 1. NameError
# Print("Hello") # NameError: name 'Print' is not defined
关于 pretty_errors.configure 语句的更多信息可以参考 pretty-errors 官方文档。
报错信息如下:
5. Python 异常类型样例
为什么要挑这个模块来讲述,这就要引出本文的重点了,那就是 Python 异常类型的总结。我觉得有必要总结一下,让初学者能够有所认识,以至于看到报错信息后能够了然于胸。
5.1 Python 有哪些异常类型
参考 Python 标准库关于内置异常的官方文档中的介绍,Python 的异常层次结构2:
BaseException+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration
+-- StopAsyncIteration
+-- ArithmeticError
| +-- FloatingPointError
| +-- OverflowError
| +-- ZeroDivisionError
+-- AssertionError
+-- AttributeError
+-- BufferError
+-- EOFError
+-- 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
+-- SystemError
+-- TypeError
+-- ValueError
| +-- UnicodeError
| +-- UnicodeDecodeError
| +-- UnicodeEncodeError
| +-- UnicodeTranslateError
+-- Warning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- RuntimeWarning
+-- SyntaxWarning
+-- UserWarning
+-- FutureWarning
+-- ImportWarning
+-- UnicodeWarning
+-- BytesWarning
+-- ResourceWarning
5.2 部分异常类型介绍2
SystemExit
此异常由 sys.exit() 函数引发。它继承自 BaseException 而不是 Exception 以确保不会被处理 Exception 的代码意外捕获。如果该值为一个整数,则它指明系统退出状态码(会传递给 C 的 exit() 函数);如果该值为 None,则退出状态码为零。
KeyboardInterrupt
当用户按下中断键(通常为 Control-C 或 Delete)时将被引发。在执行期间,会定期检测中断信号。
StopIteration
迭代器不能产生下一项。
OverflowError
算数运算的结果大到无法表示时引发,对整数来说不可能发生(而是 MemoryError),出于历史原因,有时整数超过要求范围会引发该错误。
ZeroDivisionError
当除法或取余运算的第二个参数为零时被引发。
print(1/0) # ZeroDivisionError: division by zero
AssertionError
assert 语句失败时被引发。
AttributeError
当属性引用或赋值失败时被触发,但是当一个对象根本不支持属性引用或赋值时将引发 TypeError。
BufferError
与缓冲区相关的操作无法执行时被触发。
EOFError
当 input() 函数未读取到任何数据便到达文件结束文件 EOF 时被触发。
ImportError
当 import 语句尝试加载模块遇到麻烦时被触发。
ModuleNotFoundError
当一个模块无法被定位时将被触发。
IndexError
当序列索引超出范围时被触发。
KeyError
键值对不存在。
MemoryError
某个操作耗尽了内存。
NameError
当某个局部或全局名称未找到时被引发。
Print("Hello") # NameError: name 'Print' is not defined
UnboundLocalError
当在函数或方法中对某个局部变量进行引用,但该变量并未绑定任何值时被触发。
BlockingIOError
当一个操作会被某个设置为非阻塞操作的对象(例如套接字)所阻塞时将被引发。
ChildProcessError
当一个子进程上的操作失败时将被引发。
FileExistsError
试图创建一个已存在的文件或目录时被触发。
FileNotFoundError
所请求的文件或目录不存在。
InterruptedError
当系统调用被输入中断信号时触发。
IsADirectoryError
请求对一个目录执行文件操作(os.remove())。
NotADirectoryError
在非目录上请求目录操作(os.listdir())。
PermissionError
没有足够权限时试图进行某个操作。
ProcessLookupError
给定进程不存在时被引发。
TimeoutError
一个系统函数发生系统级超时的情况下被引发。
RuntimeError
当检测到一个不归属于任何其他类别的错误时将被引发。
RecursionError
检测到超过最大递归深度。
SyntaxError
解释器遇到语法错误。
IndentationError
不正确的缩进相关的语法错误。
TabError
缩进包含对制表符和空格符不一致的使用时被引发。
SystemError
解释器内部错误。
TypeError
当一个操作或函数被应用于类型不适当的对象时将被引发。
print('s' + 1) # TypeError: Can't convert 'int' object to str implicitly
ValueError
当操作或函数接收到具有正确类型但值不适合的参数。