异常捕捉
通常我们在项目中,针对异常的捕捉会使用 try + except,基本形式如下:
try: # 主代码 except IndexError as e: # 索引异常时执行这里 logger.debug(e) except KeyError as e: # 关键字异常时执行这里 logger.debug(e) except ValueError as e: # 值异常时执行这里 logger.debug(e) except Exception as e: # 万能异常,若出现了与上述指定的异常不同的异常,就走这里 logger.debug(e)
上述方式有一个弊端,假设我们的主代码中有一个报错,那么日志输出时只会有一行异常对象的值,我们无法追踪定位到底是第几行报错,只能凭程序员的经验或直觉去判断。这时我们可以试试使用 traceback 模块。
traceback
traceback 模块提供三个方法
traceback.print_exc() # 在屏幕中输出异常栈 traceback.format_exc() # 把异常栈以字符串的形式返回,print(traceback.format_exc()) 的效果相当于 traceback.print_exc() traceback.print_exception() # 其实traceback.print_exc()函数只是traceback.print_exception()函数的一个简写形式,而它们获取异常相关的数据都是通过sys.exc_info()函数得到的
示例
def func(a, b): return a / b if __name__ == ‘__main__‘: import sys import traceback try: func(1, 0) except Exception as e: print("eeeeeeeeeeeeeeeeee") exc_type, exc_value, exc_tb = sys.exc_info() print(exc_type) print(exc_value) print(exc_tb) traceback.print_exception(exc_type, exc_value, exc_tb) # 效果等同于traceback.print_exc() ‘‘‘ sys.exc_info()返回的值是一个元组, exc_type是异常的对象类型, exc_value是异常的值, exc_tb是一个traceback对象,对象中包含出错的行数、位置等数据。 然后通过print_exception函数对这些异常数据进行整理输出。 ‘‘‘
其中,元祖的第三个元素 exc_tb 还可以细分
# traceback模块提供了 extract_tb 函数来更加详细的解释 traceback 对象所包含的数据 def func(a, b): return a / b if __name__ == ‘__main__‘: import sys import traceback try: func(1, 0) except: _, _, exc_tb = sys.exc_info() for filename, linenum, funcname, source in traceback.extract_tb(exc_tb): print("%-23s:%s ‘%s‘ in %s()" % (filename, linenum, source, funcname)) ‘‘‘ 输出结果: samchimac:tracebacktest samchi$ python ./teststacktrace.py ./teststacktrace.py :7 ‘func(1, 0)‘ in <module>() ./teststacktrace.py :2 ‘return a / b‘ in func() ‘‘‘
写入日志
traceback 的 三个方法中,print_exc() 和 print_exception() 都没有返回值,只输出到控制台(屏幕),如果要写入日志,使用 format_exc(),日志的异常输出会定位到具体行
import traceback try: # 主代码 except IndexError as e: # 索引异常时执行这里 logger.debug(traceback.format_exc()) except KeyError as e: # 关键字异常时执行这里 logger.debug(traceback.format_exc()) except ValueError as e: # 值异常时执行这里 logger.debug(traceback.format_exc()) except Exception as e: # 万能异常,若出现了与上述指定的异常不同的异常,就走这里 logger.debug(traceback.format_exc())
参考:https://www.jianshu.com/p/01ed4b8d7d9a
原文地址:https://www.cnblogs.com/zhuminghui/p/12028943.html
时间: 2024-10-07 00:21:24