仅显示追溯的第一行和最后一行

时间:2014-01-02 14:06:22

标签: python dsl

我用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.

我不情愿地想要使用普通版画!

3 个答案:

答案 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执行更复杂的操作。