我用python构建了一个内部DSL。我正在使用assert
vor验证。如果最终用户键入了错误的参数,则dsl应报告错误。目前这看起来像这样:
Traceback (most recent call last):
File "tests/maskedtimefilter_test/FilterDSL_test.py", line 63, in test_dsl_validation
input(0): self.regular
File "/Users/sh/reetz/pythonpath/maskedtimedata/maskedtimefilter.py", line 885, in __lshift__
kwargs = self.dsl_validation(kwargs)
File "/Users/sh/reetz/pythonpath/maskedtimedata/maskedtimefilter.py", line 1483, in dsl_validation
check_if_valid(parameter)
File "/Users/sh/reetz/pythonpath/maskedtimedata/dsl.py", line 47, in kernel_a
def kernel_a (x): assert isinstance(x, (list, tuple, np.ndarray)), "kernel must be a list."
AssertionError: kernel must be a list.
但最终用户是工程师,没有计算机科学家。因此,最小的Traceback非常方便。 是否有可能将Traceback缩小为基本信息 (失败的原因在哪里以及原因是什么) 是这样的?:< / EM>
Traceback (most recent call last):
File "tests/maskedtimefilter_test/FilterDSL_test.py", line 63, in test_dsl_validation
input(0): self.regular
AssertionError: kernel must be a list.
我不情愿地想要使用普通版画!
答案 0 :(得分:5)
为什么不将回溯数据作为数组返回并从中恢复呢?
import traceback
try:
codethatwillthrowanexception()
except:
exceptiondata = traceback.format_exc().splitlines()
exceptionarray = [exceptiondata[-1]] + exceptiondata[1:-1]
答案 1 :(得分:3)
您的调用堆栈中的某个位置可以执行此操作:
try:
my_function_that_can_raise_exception()
except Exception: #or AssertionError
import traceback
traceback.print_exc(limit=1)
limit
是您要显示的堆栈跟踪条目的深度。 (在你的情况下,1)
演示:
In [21]: def f():
...: assert False == True, 'Assertion!'
...:
In [22]: try:
...: f()
...: except Exception:
...: import traceback
...: traceback.print_exc(limit=1)
...:
Traceback (most recent call last):
File "<ipython-input-22-78f9db8d5188>", line 2, in <module>
f()
AssertionError: Assertion!
在traceback
docs了解详情。
答案 2 :(得分:1)
由于追溯的第一部分就是你所说的,你可以这么简单,比如:
try:
input(0): self.regular # base call
except AssertionError as ae: # catch the exception
print(ae) # print out the message
您可print
输出您认为在except
区块中有用的内容。
或者,您可以使用traceback
module执行更复杂的操作。