Chinaunix首页 | 论坛 | 博客
  • 博客访问: 147984
  • 博文数量: 51
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 255
  • 用 户 组: 普通用户
  • 注册时间: 2020-12-30 16:49
文章分类
文章存档

2021年(48)

2020年(3)

我的朋友

分类: Python/Ruby

2021-01-06 14:37:33

当我们写的一个脚本或程序发生各种不可预知的异常时,如果我们没有进行捕获处理的时候,通常都会致使程序崩溃退出,并且会在终端打印出一堆 **密密麻麻** 的 traceback 堆栈信息来告诉我们,是哪个地方出了问题。


就像这样子,天呐,密集恐惧症要犯了都


>本期小编推送2021初学者一定会用到的Python资料,含有小编自己呕心沥血整理的免费书籍/视频/在线文档和编辑器/源代码,关于`Python`的安装qun:850973621




![image.png](https://upload-images.jianshu.io/upload_images/25205170-0d817c492f32e6ee.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)




上面这段 traceback


*   只有黑白两个颜色,无法像代码高亮那样,对肉眼实现太不友好了
*   无法直接显示报错的代码,排查问题慢人一步,效率太低


那有没有一种办法,可以解决这些问题呢?


当然有了,在 Python 中,没有什么问题是一个库解决不了的,如果有,那就等你去开发这个库。


今天要介绍的这个库呢,叫做 `pretty-errors` ,从名字上就可以知道它的用途,是用来美化错误信息的。


通过这条命令你可以安装它


```
$ python3 -m pip install pretty-errors
复制代码
```


## 1\. 环境要求


由于使用了 `pretty-errors` 后,你的 traceback 信息输出,会有代码高亮那样的效果,因此当你在使用测试使用 `pretty-error` 时,请确保你使用的终端可以输出带有颜色的字体。


在 windows 上你可以使用 Powershell,cmder 等


在 Mac 上你可以使用自带的终端,或者安装一个更好用的 iTerm2


## 2\. 效果对比


* * *


随便写一个没有使用 pretty-errors ,并且报错了的程序,是这样子的。
![image.png](https://upload-images.jianshu.io/upload_images/25205170-ae1b51ff7436ce8a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)






而使用了 pretty_errors 后,报错信息被美化成这样了。


![image.png](https://upload-images.jianshu.io/upload_images/25205170-a973331be5333eac.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


是不是感觉清楚了不少,那种密密麻麻带来的焦虑感是不是都消失了呢?


当然这段代码少,你可能还没感受到,那就来看下 该项目在 Github上的一张效果对比图吧


![image.png](https://upload-images.jianshu.io/upload_images/25205170-1ad26713ca5f4c5d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)




## 3\. 配置全局可用


可以看到使用了 pretty_errors 后,无非就是把过滤掉了一些干扰我们视线的无用信息,然后把有用的关键信息给我们高亮显示。


既然既然这样,那 pretty_errors 应该也能支持我们如何自定义我们选用什么样的颜色,怎么排版吧?


答案是显而易见的。


pretty_errors 和其他库不太一样,在一定程度上(如果你使用全局配置的话),它并不是开箱即用的,你在使用它之前可能需要做一下配置。


使用这一条命令,会让你进行配置,可以让你在该环境中运行其他脚本时的 traceback 输出都自动美化。


```
$ python3 -m pretty_errors
复制代码
```


![image.png](https://upload-images.jianshu.io/upload_images/25205170-ccf773b706803c4a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)




配置完成后,你再运行任何脚本,traceback 都会自动美化了。


不仅是在我的 iTerm 终端下


![image.png](https://upload-images.jianshu.io/upload_images/25205170-18b218ab8dfcd7b1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)




在 PyCharm 中也会


![image.png](https://upload-images.jianshu.io/upload_images/25205170-364c9b352e594732.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


唯一的缺点就是,原先在 PyCharm 中的 traceback 可以直接点击 `文件路径` 直接跳转到对应错误文件代码行,而你如果是在 VSCode 可以使用 下面自定义配置的方案解决这个问题(下面会讲到,参数是:`display_link`)。


![image.png](https://upload-images.jianshu.io/upload_images/25205170-5c01c1ae77a88aaf.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


因此,有些情况下,你并不想设置 `pretty_errors` 全局可用。


那怎么取消之前的配置呢?


只需要再次输出 `python -m pretty_errors`,输出入 `C` 即可清除。


![image.png](https://upload-images.jianshu.io/upload_images/25205170-5d1dc74a47421092.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)




## 4\. 单文件中使用


取消全局可用后,你可以根据自己需要,在你需要使用 `pretty-errors` 的脚本文件中导入`pretty_errors`,即可使用


```
import pretty_errors
复制代码
```


就像这样


```
import pretty_errors


def foo():
    1/0


if __name__ == "__main__":
    foo()
复制代码
```


值得一提的是,使用这种方式,若是你的脚本中,出现语法错误,则输出的异常信息还是按照之前的方式展示,并不会被美化。


因此,为了让美化更彻底,官方推荐你使用 `python -m pretty_errors`


## 5\. 自定义设置


上面的例子里,我们使用的都是 `pretty_errors` 的默认美化格式,展示的信息并没有那么全。


比如


*   它并没有展示报错文件的绝对路径,这将使我们很难定位到是哪个文件里的代码出现错误。
*   如果能把具体报错的代码,给我们展示在终端屏幕上,就不需要我们再到源码文件中排查原因了。


如果使用了 `pretty_errors` 导致异常信息有丢失,那还不如不使用 `pretty_errors` 呢。


不过,可以告诉你的是,`pretty_errors` 并没有你想象的那么简单。


它足够开放,支持自定义配置,可以由你选择你需要展示哪些信息,怎么展示?


这里举一个例子


```
import pretty_errors


# 【重点】进行配置
pretty_errors.configure(
    separator_character = '*',
    filename_display    = pretty_errors.FILENAME_EXTENDED,
    line_number_first   = True,
    display_link        = True,
    lines_before        = 5,
    lines_after         = 2,
    line_color          = pretty_errors.RED + '> ' + pretty_errors.default_config.line_color,
    code_color          = '  ' + pretty_errors.default_config.line_color,
)


# 原来的代码
def foo():
    1/0


if __name__ == "__main__":
    foo()
复制代码
```


在你像上面这样使用 `pretty_errrs.configure` 进行配置时,抛出的的异常信息就变成这样了。


![image.png](https://upload-images.jianshu.io/upload_images/25205170-cfa3a5713fdcb397.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)




当然了,`pretty_errors.configure()` 还可以接收很多的参数,你可以根据你自己的需要进行配置。


### 5.1 设置颜色


*   `header_color`:设置标题行的颜色。
*   `timestamp_color`:设置时间戳颜色
*   `default_color`:设置默认的颜色
*   `filename_color`:设置文件名颜色
*   `line_number_color`:设置行号颜色。
*   `function_color`:设置函数颜色。
*   `link_color`:设置链接的颜色。


在设置颜色的时候,`pretty_errors` 提供了一些常用的 颜色常量供你直接调取。


*   `BLACK`:黑色
*   `GREY`:灰色
*   `RED`:红色
*   `GREEN`:绿色
*   `YELLOW`:黄色
*   `BLUE`:蓝色
*   `MAGENTA`:品红色
*   `CYAN`:蓝绿色
*   `WHITE`:白色


而每一种颜色,都相应的匹配的 `BRIGHT_` 变体 和 `_BACKGROUND` 变体,


其中,`_BACKGROUND` 用于设置背景色,举个例子如下。
![image.png](https://upload-images.jianshu.io/upload_images/25205170-bd73d965baad78dc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)






### 5.2 设置显示内容


*   `line_number_first` 启用后,将首先显示行号,而不是文件名。


*   `lines_before` : 显示发生异常处的前几行代码


*   `lines_after`: 显示发生异常处的后几行代码


*   `display_link`:启用后,将在错误位置下方写入链接,VScode将允许您单击该链接。


*   `separator_character`:用于创建标题行的字符。默认情况下使用连字符。如果设置为 `''` 或者 `None` ,标题将被禁用。


*   `display_timestamp`:启用时,时间戳将写入回溯头中。


*   `display_locals` 启用后,将显示在顶部堆栈框架代码中的局部变量及其值。


*   `display_trace_locals` 启用后,其他堆栈框架代码中出现的局部变量将与它们的值一起显示。


### 5.3 设置怎么显示


*   `line_length`:设置每行的长度,默认为0,表示每行的输出将与控制台尺寸相匹配,如果你设置的长度将好与控制台宽度匹配,则可能需要禁用`full_line_newline`,以防止出现明显的双换行符。


*   `full_line_newline`:当输出的字符满行时,是否要插入换行符。


*   `timestamp_function` 调用该函数以生成时间戳。默认值为`time.perf_counter`。


*   `top_first` 启用后,堆栈跟踪将反转,首先显示堆栈顶部。


*   `display_arrow` 启用后,将针对语法错误显示一个箭头,指向有问题的令牌。


*   `truncate_code` 启用后,每行代码将被截断以适合行长。


*   `stack_depth` 要显示的堆栈跟踪的最大条目数。什么时候`0`将显示整个堆栈,这是默认值。


*   `exception_above` 启用后,异常将显示在堆栈跟踪上方。


*   `exception_below`: 启用后,异常显示在堆栈跟踪下方。


*   `reset_stdout` 启用后,重置转义序列将写入stdout和stderr;如果您的控制台留下错误的颜色,请启用此选项。


*   `filename_display`


    设置文件名的展示方式,有三个选项: `pretty_errors.FILENAME_COMPACT` 、`pretty_errors.FILENAME_EXTENDED`,或者`pretty_errors.FILENAME_FULL`


以上,就是我对 `pretty_errors` 的使用体验,总的来说,这个库功能非常强大,使用效果也特别酷炫,它就跟 PEP8 规范一样,没有它是可以,但是有了它会更好一样。对于某些想自定义错误输出场景的人,`pretty_errors` 会是一个不错的解决方案,明哥把它推荐给你。




阅读(849) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~