当Expection发生时, 如何显示完整的CallStack和位置 (Traceback应用)

为了在python GUI 程序开发时有更好的开发者体验, 笔者喜欢先收集别人的痛点及各种解决方案, 整理成属於自己的优化方案再导入到GUI专案中, 而Exception 的呈现方式就是其中一个痛点.

引用自近期网友询问Python 的Try Exception的问题片段 ...

引用来源: https://reurl.cc/XlWje3

在专案中有很多使用者会使用exception 去做例外的拦截, 但很常遇到的状况是Exception并不会把完整的CallStack及位置显示出来, 这就增添除错时的困难度, 尤其在大型专案或多档案的程序码中, 不处理好就会演变成一场大灾难.

来看个简单的例子:

dict_a = {0:'hello',1:'hi'}
def run():
    try:
       print ("Hello, this is dmeo.\n")
       print(dict_a[2])
       print ("End")
    except Exception as err:
        print(err)
run()

例外发生的时候看不到完整的callstack 及行号

这次笔者使用traceback , 这个内建的模组做实验

import sys
import traceback
 
dict_a = {0:'hello', 1:'hi'}

def run():
   try:
       print ("Hello, this is demo.\n")
       print (dict_a[2])
       print ("End")
   except Exception as err:
       err_type = err.__class__.__name__ # 取得错误的class 名称
       info = err.args[0] # 取得详细内容
       detains = traceback.format_exc() # 取得完整的tracestack
       n1, n2, n3 = sys.exc_info() #取得Call Stack
       lastCallStack =  traceback.extract_tb(n3)[-1] # 取得Call Stack 最近一笔的内容
       fn = lastCallStack [0] # 取得发生事件的档名
       lineNum = lastCallStack[1] # 取得发生事件的行数
       funcName = lastCallStack[2] # 取得发生事件的函数名称
       errMesg = f"FileName: {fn}, lineNum: {lineNum}, Fun: {funcName}, reason: {info}, trace:\n {traceback.format_exc()}"
       print(errMesg)
       
run()

流程

  1. 取得Exception的类型
  2. 取得最近一笔的的CallStack
  3. 利用traceback套件来解开Stack内容
  4. 取得档名、行号、函数名称
  5. 取得完整的callstack字串

执行结果

结论
我们可以把这个好用的模组使用方式包成一个简单的模组, 搭配logging或写成档案去做相关的纪录, 这样就可以减少程序出错後的除错难度

参考资料


<<:  DAY6-我的SQL

>>:  [Day 13] 实作 API Authentication

Day 6:Hello....iOS world! 建立第一个KMM专案(iOS)

Keyword:Xcode,simulator 到Day6完成第一个KMM专案的Code放在 KMM...

Day04 - 学习 Vue CLI package.json 设定档

今天回到大神的教学 重新认识 Vue.js | Kuro Hsu 3-3 Vue CLI 环境设定与...

Day3 安装渗透测试用的作业系统- Kali Linux 和 Parrot OS

上图为常见的虚拟机软件 VirtualBox 与 VMWare Player 比较与常见渗透测试的...

Day14-Redux 篇-介绍 Redux

这篇主要会讲述 Redux 的一些介绍,下篇才会开始进行实作。 Redux 是什麽? Redux 是...

[Day 26] 从 AsyncPipe 出发,微探讨 Angular 处理 pipe 的流程

昨天介绍了 AsyncPipe 的用法以及它可以带来的便利,今天要来看一下在这方便的背後是由那些东西...