0
点赞
收藏
分享

微信扫一扫

Python 模块探索 —— pretty_errors

Brose 2022-06-21 阅读 63


文章目录

  • ​​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_errors​​​1​​。它的作用是什么呢?美化 Python 异常输出以使其清晰可读

简单来说,如下图所示,它可以将繁杂冗长的错误输出凝练出核心信息给您,让您立马就知道错误是什么,在哪里。
Python 模块探索 —— pretty_errors_ico

2. 安装以及使用过程

正如其它模块一样,该模块的安装过程十分简单:​​python -m pip install pretty_errors​​。

使用过程也是十分简单,只需要 import 该模块即可,如下所示:

测试代码:

import pretty_errors
print(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.py
Traceback (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_errors
pretty_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 官方文档​​。

报错信息如下:

Python 模块探索 —— pretty_errors_python_02

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

当操作或函数接收到具有正确类型但值不适合的参数。

  1. ​​pretty-errors​​​ ​​↩︎​​
  2. ​​Documentation Python 3.9.6 —— 内置异常 ​​​ ​​↩︎​​ ​​↩︎​​


举报

相关推荐

0 条评论