Python: 当捕获所有异常时,如何将异常名称存储在变量中?

4
我知道我可以使用以下语法将异常名称存储在变量中:

try:
    code
except TypeError as e:
    logger.error(e)
except NameError as e:
    logger.error(e)

我如何对通用的except:消息执行相同的操作? 我认为这个(也就是一般思路)不会起作用:

try:
    code
except as e:
    logger.error(e)

1
永远不要尝试捕获裸的 except,因为它甚至会停止使用 CTRL-C 捕获流氓程序。 - Mark Lawrence
4个回答

3

您可以使用type(e).__name__来捕获任何错误的名称,并像访问普通变量一样访问消息,使用e.message。所有内置错误(indexError、TypeError等)都是Exception类的子类,因此它们会被捕获。将其保存为名为“err”的变量:

try:
   code
except Exception as e:
   err = type(e).__name__
   message = e.message

这将保存您遇到的任何基本Python类型Exception的错误类型,使用内置的__name__变量。


我是否也应该捕获BaseException(而不仅仅是用户定义的异常)?正如另一条评论所建议的那样? - user2824889
1
你可以在Python文档中深入了解它,但是Exception将覆盖BaseException以及用户创建的错误,这些错误应该作为一个Exception对象创建。简而言之,Exception将涵盖所有内置的、非系统退出的错误。 - Richard Stoeffel

3

BaseException 是您可以捕获的最广泛类型:

try:
    # some code
except BaseException as e:
    logger.error(e)

0

你可以捕获 Exception 异常:

import logging

try:
    code
except TypeError as e:
    logger.error(e)
except NameError as e:
    logger.error(e)
except Exception as e:
    logging.error(e)

1
如果你以相同的方式处理它们,那么最好直接捕获Exception,因为它包含了其他异常。 - John Gordon

0

我在Python 2中遇到了这个问题,旧式类别不会被except Exceptionexcept BaseException捕获。我通过使用sys.exc_info来访问当前异常来解决它:

import sys

try:
    code
except:
    e = sys.exc_info()[1]
    logging.error(e)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接