【问题标题】:Is it possible to catch multiple types of exceptions and then print the exact type that occurred?是否可以捕获多种类型的异常,然后打印发生的确切类型?
【发布时间】:2013-09-26 03:41:28
【问题描述】:

这是closest answer,我可以在捕获多个异常时找到(正确的方法),在默许奇迹之后,解释器允许以下 sn-p:

try:
    x = "5" + 3
except NameError and TypeError as e:
    print e

docs 也会提供这个 sn-p,但与前者不同:

... except (RuntimeError, TypeError, NameError):
...     pass

所以最好有第二个意见,但我的问题真的归结为:

  • 我怎样才能不仅打印消息,而且在打印语句的开头插入引发的错误的确切类型。例如,我希望第一个 sn-p 通过打印来响应:TypeError: cannot concatenate 'str' and 'int' objects

鉴于解释器仅将 argsmessage 列为 NameError 的成员,我觉得这可能是不可能的,或者是容易的,但也许这根本不完整。

我自己试过这个,但它不再排除错误(我可能误解了 isinstance):

try:
    x = "5" + 3
except (NameError, TypeError) as e:
    if isinstance(e, NameError):
        print "NameError: " + e
    elif isinstance(e, TypeError):
        print "TypeError: " + e
    else:
        print e

【问题讨论】:

  • type(e).__name__?不过,这可能不是最好的方法。
  • @minitech 真是天才,但我仍然不知道为什么我的最后一个 sn-p 失败了。我似乎误解了我在做什么。
  • 它失败了,因为你不能轻易地连接一个带有异常的字符串。
  • 另一方面,print "NameError:", e?

标签: python exception python-2.7 exception-handling


【解决方案1】:

您可以单独捕获错误。有关更多示例,请参见此链接: http://docs.python.org/2/tutorial/errors.html#handling-exceptions

类似于以下内容:

try:
    x = "5" + 3
except TypeError as e:
    print "This is a TypeError"
    print e
except NameError as e:
    print "This is a NameError"
    print e

【讨论】:

    【解决方案2】:

    其他人已经很好地回答了您的第二个问题,所以我将解决您的第一个问题:

    except NameError and TypeError as e:
    

    完全一样:

    except TypeError as e:
    

    它不会捕获NameError。为什么?因为NameError 是真实的,所以and 计算并返回它的第二个参数TypeError。试试:

    print NameError and TypeError
    

    是的,except 子句中的异常像任何其他表达式一样在运行时评估。事实上,Python 甚至不要求它们是异常(但是,如果它们不是,它们永远不会捕获任何东西,因为 raise 确实需要异常......好吧,你可以使用字符串,但它们已被弃用)。

    因此,您必须提供要捕获的异常元组:

    except (TypeError, ValueError) as e:
    

    Python 可能会接受其他形式作为有效语法,但可能不会像您预期的那样工作。

    【讨论】:

      【解决方案3】:

      既然 minitech 已经向您展示了做您想做的事情的最佳方法 (print type(e).__name__),我将只介绍您做错了什么。

      如果e = NameError("BAD, BAD, BAD!"),则print e 给出BAD, BAD, BAD!

      但是,"My string" + e 无效,因为e 不是字符串。请改用print "My string", eprint "My string" + str(e)print "My string{}".format(e)

      【讨论】:

        【解决方案4】:

        你的问题是你试图用这样的异常连接一个字符串

        >>> 'foo' + TypeError
        Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
        TypeError: cannot concatenate 'str' and 'type' objects
        

        最简单的解决方法:

        >>> 'foo' + str(TypeError)
        "foo<type 'exceptions.TypeError'>"
        >>> 
        

        【讨论】:

        • 感谢您的精彩解释,因为print e 是可以接受的,我知道它是一个字符串!对我来说这不是一件聪明的事。
        • 为什么异常要突然变成字符串?奇怪的想法!
        • “在 Python 1.5 之前,标准异常被实现为字符串。”(!)来源:Core Python Programming,第 2 版;韦斯利·J·春;普伦蒂斯大厅,2007;第 10.5 章:*字符串形式的异常。添加了感叹号。 ;)
        猜你喜欢
        • 2019-05-06
        • 1970-01-01
        • 2010-10-08
        • 1970-01-01
        • 1970-01-01
        • 2021-05-31
        • 1970-01-01
        • 2015-11-21
        • 1970-01-01
        相关资源
        最近更新 更多