我如何打印错误/异常在except:块?
try:
...
except:
print(exception)
我如何打印错误/异常在except:块?
try:
...
except:
print(exception)
当前回答
对于Python 2.6及更高版本和Python 3.x:
except Exception as e: print(e)
对于Python 2.5及更早版本,使用:
except Exception,e: print str(e)
其他回答
在捕获异常时,可以控制显示/记录跟踪中的哪些信息。
的代码
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'
打印/记录完整的回溯
正如其他人已经提到的,你可以通过使用traceback模块来捕获整个跟踪:
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'
我建议使用try-except语句。此外,日志异常不是使用print语句,而是在记录器上记录级别为ERROR的消息,我发现这比print输出更有效。该方法只能从异常处理程序调用,如下所示:
import logging
try:
*code goes here*
except BaseException:
logging.exception("*Error goes here*")
如果你想了解更多关于日志记录和调试的知识,这个python页面上有很好的文档。
如果你想传递错误字符串,这里有一个来自错误和异常(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
在这里展开“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
在Python 2.6或更高版本中,它更简洁:
except Exception as e: print(e)
在较旧的版本中,它仍然是相当可读的:
except Exception, e: print e