如何在 Python 中打印异常?

问题描述 投票:0回答:11

如何在

except:
块中打印错误/异常?

try:
    ...
except:
    print(exception)
python exception error-handling
11个回答
1938
投票

对于 Python 2.6 及更高版本和 Python 3.x:

except Exception as e: print(e)

对于 Python 2.5 及更早版本,请使用:

except Exception,e: print str(e)

802
投票

traceback
模块提供了格式化和打印异常及其回溯的方法,例如这将像默认处理程序一样打印异常:

import traceback

try:
    1/0
except Exception:
    traceback.print_exc()

输出:

Traceback (most recent call last):
  File "C:\scripts\divide_by_zero.py", line 4, in <module>
    1/0
ZeroDivisionError: division by zero

201
投票

Python 2.6 或更高版本中它更干净一点:

except Exception as e: print(e)

在旧版本中它仍然具有很好的可读性:

except Exception, e: print e

134
投票

Python 3:
logging

可以使用更灵活的

print()
 模块来记录异常,而不是使用基本的 
logging
功能。
logging
模块提供了很多额外的功能,例如,记录消息...

  • 进入给定的日志文件,或者
  • 带有时间戳和有关日志记录发生位置的附加信息。

有关更多信息,请查看官方文档


使用方法

可以使用模块级函数

logging.exception()
来记录异常,如下所示:

import logging

try:
    1/0
except BaseException:
    logging.exception("An exception was thrown!")

输出

ERROR:root:An exception was thrown!
Traceback (most recent call last):
File ".../Desktop/test.py", line 4, in <module>
    1/0
ZeroDivisionError: division by zero 

注释

  • 函数

    logging.exception()
    只能从异常处理程序中调用

  • logging
    模块不应在日志记录处理程序中使用,以避免
    RecursionError
    (感谢@PrakharPandey


替代日志级别

也可以使用另一个日志级别记录异常,但仍然使用关键字参数

exc_info=True
显示异常详细信息,如下所示:

logging.critical("An exception was thrown!", exc_info=True)
logging.error   ("An exception was thrown!", exc_info=True)
logging.warning ("An exception was thrown!", exc_info=True)
logging.info    ("An exception was thrown!", exc_info=True)
logging.debug   ("An exception was thrown!", exc_info=True)

# or the general form
logging.log(level, "An exception was thrown!", exc_info=True)

仅名称和描述

当然,如果您不需要整个回溯,而只需要一些特定信息(例如异常名称和描述),您仍然可以使用

logging
模块,如下所示:

try:
    1/0
except BaseException as exception:
    logging.warning(f"Exception Name: {type(exception).__name__}")
    logging.warning(f"Exception Desc: {exception}")

输出

WARNING:root:Exception Name: ZeroDivisionError
WARNING:root:Exception Desc: division by zero

79
投票

这里扩展了“ except Exception as e:”解决方案,这是一个很好的单行代码,其中包括一些附加信息,例如错误类型及其发生位置。

try:
    1/0
except Exception as e:
    print(f"{type(e).__name__} at line {e.__traceback__.tb_lineno} of {__file__}: {e}")

输出:

ZeroDivisionError at line 48 of /Users/.../script.py: division by zero

76
投票

(我本来打算将此作为对 @jldupont 的答案的评论,但我没有足够的声誉。)

我也在其他地方看到过类似@jldupont 的答案。 FWIW,我认为重要的是要注意这一点:

except Exception as e:
    print(e)
默认情况下,

会将错误输出打印到

sys.stdout
。一般来说,更合适的错误处理方法是:

except Exception as e:
    print(e, file=sys.stderr)

(请注意,您必须

import sys
才能正常工作。)这样,错误就会打印到
STDERR
而不是
STDOUT
,这样可以进行正确的输出解析/重定向等。我知道这个问题严格来说是关于“打印错误”,但在这里指出最佳实践似乎很重要,而不是忽略这个细节,因为这可能会导致任何最终学得不好的人得到非标准代码。

我没有像 Cat Plus Plus 的答案那样使用

traceback
模块,也许这是最好的方法,但我想我应该把它扔在那里。


71
投票

如果您想传递错误字符串,这里有一个来自 Errors and Exceptions (Python 2.6)

的示例
>>> try:
...    raise Exception('spam', 'eggs')
... except Exception as inst:
...    print type(inst)     # the exception instance
...    print inst.args      # arguments stored in .args
...    print inst           # __str__ allows args to printed directly
...    x, y = inst          # __getitem__ allows args to be unpacked directly
...    print 'x =', x
...    print 'y =', y
...
<type 'exceptions.Exception'>
('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs

69
投票

在捕获异常时,人们可以很好地控制要显示/记录回溯中的哪些信息。

代码

with open("not_existing_file.txt", 'r') as text:
    pass

将产生以下回溯:

Traceback (most recent call last):
  File "exception_checks.py", line 19, in <module>
    with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'

打印/记录完整的回溯

正如其他人已经提到的,您可以使用回溯模块捕获整个回溯:

import traceback
try:
    with open("not_existing_file.txt", 'r') as text:
        pass
except Exception as exception:
    traceback.print_exc()

这将产生以下输出:

Traceback (most recent call last):
  File "exception_checks.py", line 19, in <module>
    with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'

您可以通过使用日志记录来实现相同的目的:

try:
    with open("not_existing_file.txt", 'r') as text:
        pass
except Exception as exception:
    logger.error(exception, exc_info=True)

输出:

__main__: 2020-05-27 12:10:47-ERROR- [Errno 2] No such file or directory: 'not_existing_file.txt'
Traceback (most recent call last):
  File "exception_checks.py", line 27, in <module>
    with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'

仅打印/记录错误名称/消息

您可能对整个回溯不感兴趣,而只对最重要的信息感兴趣,例如异常名称和异常消息,使用:

try:
    with open("not_existing_file.txt", 'r') as text:
        pass
except Exception as exception:
    print("Exception: {}".format(type(exception).__name__))
    print("Exception message: {}".format(exception))

输出:

Exception: FileNotFoundError
Exception message: [Errno 2] No such file or directory: 'not_existing_file.txt'

38
投票

试试这个

try:
    print("Hare Krishna!")
except Exception as er:
    print(er)

4
投票

如果您想要这样做,可以使用断言语句来引发一个线性错误。这将帮助您编写可静态修复的代码并尽早检查错误。

assert type(A) is type(""), "requires a string"

4
投票

我建议使用 try- except 语句。此外,日志记录异常不是使用打印语句,而是在记录器上记录一条具有 ERROR 级别的消息,我发现这比打印输出更有效。该方法只能从异常处理程序中调用,如下所示:

import logging

try:
    *code goes here*
except BaseException:
    logging.exception("*Error goes here*")

如果您想了解有关日志记录和调试的更多信息,此 python 页面上有很好的文档。

© www.soinside.com 2019 - 2024. All rights reserved.