Python 3.7.3中如何隐藏异常回溯里的raise代码行?
解决方案:自定义异常处理器隐藏回溯信息
当然可以实现!你完全不需要修改任何系统特性,只需要在代码里自定义异常处理逻辑,就能只保留你想要的异常信息,去掉冗余的回溯内容。
核心思路:替换默认的异常钩子(sys.excepthook)
Python 提供了sys.excepthook这个全局钩子,用来处理所有未被捕获的异常。我们可以替换这个钩子函数,让它只输出异常类型和对应的提示文本,而不打印完整的回溯栈。
示例实现代码
import sys def custom_exception_handler(exc_type, exc_value, exc_traceback): # 只打印异常类型和自定义消息 print(f"{exc_type.__name__}: {exc_value}") # 替换默认的异常处理钩子 sys.excepthook = custom_exception_handler # 你的掷骰子函数 def throw_dice(num_throws, num_sides, num_die=1): if num_die > 5: raise ValueError('num_die should not exceed 5. The value of num_die was: {}'.format(num_die)) elif num_throws > 20: raise ValueError('num_throws should not exceed 20. The value of num_throws was: {}'.format(num_throws)) elif num_sides in {4, 6, 8, 12, 20}: return int(num_die), int(num_sides), num_throws else: raise ValueError('A fair die can only have 4, 6, 8, 12, or 20 sides. The number of sides you requested was: {}'.format(num_sides)) # 测试调用 i = throw_dice(num_throws=25, num_sides=6)
运行效果
执行上面的代码后,输出会简化成你想要的样子:
ValueError: num_throws should not exceed 20. The value of num_throws was: 25
额外优化:保留调试模式
如果有时候你需要调试,想看完整的回溯信息,可以加个开关来切换模式:
import sys # 调试开关:True显示完整回溯,False只显示异常信息 DEBUG_MODE = False def custom_exception_handler(exc_type, exc_value, exc_traceback): if DEBUG_MODE: # 使用默认处理器打印完整回溯 sys.__excepthook__(exc_type, exc_value, exc_traceback) else: print(f"{exc_type.__name__}: {exc_value}") sys.excepthook = custom_exception_handler
这个方法完全在你的代码层面实现,不需要修改任何系统配置,在树莓派的Python 3.7.3上完全兼容(sys.excepthook在Python 2.0之后就存在了,3.7版本肯定支持)。
内容的提问来源于stack exchange,提问作者Jim JR Harris
相关产品推荐
相关产品推荐

