为了在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()
流程
执行结果
结论
我们可以把这个好用的模组使用方式包成一个简单的模组, 搭配logging或写成档案去做相关的纪录, 这样就可以减少程序出错後的除错难度
参考资料
>>: [Day 13] 实作 API Authentication
Keyword:Xcode,simulator 到Day6完成第一个KMM专案的Code放在 KMM...
今天回到大神的教学 重新认识 Vue.js | Kuro Hsu 3-3 Vue CLI 环境设定与...
上图为常见的虚拟机软件 VirtualBox 与 VMWare Player 比较与常见渗透测试的...
这篇主要会讲述 Redux 的一些介绍,下篇才会开始进行实作。 Redux 是什麽? Redux 是...
昨天介绍了 AsyncPipe 的用法以及它可以带来的便利,今天要来看一下在这方便的背後是由那些东西...