可能重复:
引发异常时如何修改 Python 回溯对象?
考虑这个玩具示例:
def twice(n):
_validate_twice_args(n)
return 2*n
def _validate_twice_args(n):
if type(n) != int:
raise TypeError('n must be an int')
twice(None)
--
Traceback (most recent call last):
File "demo.py", line 9, in <module>
twice(None)
File "demo.py", line 2, in twice
_validate_twice_args(n)
File "demo.py", line 7, in _validate_twice_args
raise TypeError('n must be an int')
TypeError: n must be an int
即使错误的位置是 call twice(None)
,回溯指的是负责错误的人甚至不知道的代码,(“_validate
谁?我从来没有调用过它!我什至不知道它是什么!”) ,并且不必要地暴露了应该在“API 后面”的代码。 即使在没有“私有”辅助函数的情况下_validate_twice_args
,响应错误参数而打印的堆栈跟踪也会不必要地暴露内部代码,并掩盖错误的位置。
例如,如果内联 的代码_validate_twice_args
,堆栈跟踪如下所示:
Traceback (most recent call last):
File "demo.py", line 10, in <module>
twice(None)
File "demo.py", line 3, in twice
raise TypeError('n must be an int')
TypeError: n must be an int
要了解此类错误的堆栈跟踪应该是什么样子,这是由非常相似类型的错误产生的错误,调用twice()
而不是twice(None)
,但在控制权传递给之前由 Python 引发twice
:
Traceback (most recent call last):
File "demo.py", line 9, in <module>
twice()
TypeError: twice() takes exactly 1 argument (0 given)
在这种情况下,错误也在于twice
使用无效参数列表调用。因此,堆栈跟踪直接指向错误的位置(而不是指向底层 [最有可能的 C] 代码中第一次检测到错误的行,谢天谢地)。这是应该的,IMO 1。
如何修改twice_args
和/或_validate_twice_args
使堆栈跟踪的最后一行引用错误调用的源代码行twice
?
1我意识到在这种情况下关于堆栈跟踪应该说什么的意见与我的不同,但这些哲学考虑不是本线程的主题。
编辑:在原始帖子中强调了评论,但显然被前两个响应者忽略了。