【问题标题】:Print exception details recursively while using try except [duplicate]使用 try except [重复] 时递归打印异常详细信息
【发布时间】:2017-10-23 16:11:23
【问题描述】:
#!/usr/bin/env python

#import re


def test_ex1(input):
    if re.match(r'^[A-Z]+$',input):
        print 'Match'
        return True
    print 'No Match'
    return False   


#test_ex1('ABC')
try:
    test_ex1('ABC')
except Exception:
    raise Exception

如果我运行上述程序,它将打印以下异常消息。

a:~/Python> python test.py
Traceback (most recent call last):
  File "test.py", line 18, in <module>
    raise Exception
Exception

在不更改 test_ex1 子例程的情况下使用try except 捕获异常时,在 Python 中打印以下堆栈跟踪的正确方法是什么?

Traceback (most recent call last):
  File "test.py", line 15, in <module>
    test_ex1('ABC')
  File "test.py", line 8, in test_ex1
    if re.match(r'^[A-Z]+$',input):
NameError: global name 're' is not defined

【问题讨论】:

  • 是否要重新引发异常?
  • 如何递归打印所有异常而不在函数内的每个函数中添加print_exc 调用?

标签: python exception


【解决方案1】:

一种方法是使用traceback 模块

import traceback

try:
  re.match()
except Exception:
  traceback.print_exc()

【讨论】:

  • 我可以在不接触test_ex1子程序的情况下做到这一点吗?
  • @Jean 当然,你不必修改它。请尝试以下操作:在 except 正文中,只需编写 pass。不会打印任何内容。现在,输入traceback.print_exc()。将打印回溯。无需修改。
  • 如果你的意思是你可以放弃这个并在test_ex1 块内使用test_ex1 那么是的,你可以。请注意,您可能需要更改参数的名称,input 是 python 中的内置函数。
  • 谢谢。当 Python 似乎能够在本地打印堆栈跟踪时,为什么我必须 import traceback
  • 我们导入它,以便我们可以根据需要处理回溯。我们需要使用 import 来做到这一点,因为 python 标准库很大,它被分隔在模块中,这样编译器就不必在每个程序中加载所有内容。
【解决方案2】:

我曾经使用以下将所有回溯打印为:

import sys

try:
    # code here
except Exception:
    print(sys.exc_info()[0])

raise 关键字用于将错误抛到堆栈并在函数调用的上层处理。

【讨论】:

  • 这没有回答问题。 OP 想要打印 traceback
  • 我在上面编辑了我的答案。我误解了这个问题。很抱歉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
  • 2013-06-18
  • 2013-10-02
  • 2011-03-20
  • 2015-09-29
  • 2013-10-08
相关资源
最近更新 更多