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

Posted

技术标签:

【中文标题】如何让 Try except 输出更多细节?显示它到底发生在哪里? - Python [重复]【英文标题】:How to let Try Except output more details? To show where exactly did it happen? - Python [duplicate] 【发布时间】:2021-06-20 06:40:53 【问题描述】:

如果我们输入

10/0

它将输出:(此处的问题 --- 使用 Try except 时所需的输出)

Traceback (most recent call last):
  File "D:\Python_Projects\00_Live\env\lib\site-packages\IPython\core\interactiveshell.py", line 3427, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-2-e574edb36883>", line 1, in <module>
    10/0
ZeroDivisionError: division by zero

但是如果我们使用

try:
    10/0
except Exception as e:
    print(e)

它只输出:

division by zero

我们如何让 python 在使用 Try except 时像第一种情况一样输出整个错误?

【问题讨论】:

【参考方案1】:

如果您想继续引发错误(最终会导致退出程序并打印堆栈跟踪),您可以将raise 放在except 的正文中:

try:
    10/0
except Exception as e:
    print(e)
    raise

如果您想打印堆栈跟踪但引发异常,请参阅traceback 模块:https://docs.python.org/3/library/traceback.html

【讨论】:

如何将其写入日志?我在云电脑上运行程序 一种选择是让程序的调用者捕获它的标准错误。如果您希望程序本身捕获堆栈跟踪,请拥有一个***异常处理程序,该处理程序使用该 traceback 模块从未捕获的异常中提取堆栈信息,然后将其打印到您的日志文件中。 哦,你的意思是 try: 10/0 except Exception as e: logger.exception(e) 是的,但与其把它放在10/0 周围,你可以考虑把它放在你的***main 函数周围——这样你就不需要把它放在每个人身上可能引发异常的地方。这就是异常的巨大威力——因为它们会不断向调用者提出直到被捕获,您可以使用单个 try/except 语句在整个程序中实现异常日志记录!【参考方案2】:

代替使用基本的print() 函数,可以使用更灵活的日志模块来记录异常。日志模块提供了很多额外的功能,例如将消息记录到给定的日志文件中,记录带有时间戳的消息以及有关记录发生位置的其他信息。

试试这个:

import logging

try:
    1/0
except Exception as e:
    logging.exception(e)

见documentation

【讨论】:

我的回答对你有帮助吗 对,这正是我想要的

以上是关于如何让 Try except 输出更多细节?显示它到底发生在哪里? - Python [重复]的主要内容,如果未能解决你的问题,请参考以下文章

是否可能出现“Try / except ValueError UNLESS”?

python-- try except (异常捕获)

异常处理

Python try/except:显示我的变量后显示错误原因

python异常处理

[fullcalendar]让listMonth显示比月份更多的细节