使用 try except [重复] 时递归打印异常详细信息

Posted

技术标签:

【中文标题】使用 try except [重复] 时递归打印异常详细信息【英文标题】:Print exception details recursively while using try except [duplicate] 【发布时间】: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

【问题讨论】:

是否要重新引发异常? 看看the documentation 如何递归打印所有异常而不在函数内的每个函数中添加print_exc 调用? 【参考方案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 我在上面编辑了我的答案。我误解了这个问题。很抱歉。

以上是关于使用 try except [重复] 时递归打印异常详细信息的主要内容,如果未能解决你的问题,请参考以下文章

try...except Exception

当“try .. except IOError”未捕获时如何处理 FileNotFoundError?

Python-异常处理

如何让 Try except 输出更多细节?显示它到底发生在哪里? - Python [重复]

捕获异常时,为什么我们使用Exceptions子类作为o / p清楚地给出了我们确切的异常? [重复]

在获取模型对象时如何使用 try 和 except?