ValueError vs acessing sys.exc_info()

时间:2014-06-18 15:36:08

标签: python

为什么“class'NameError'”无法通过ValueError访问,或者有一种方法可以做到这一点我不知道?

我需要像在下面的代码中那样调用sys.exec_info()来访问有关错误调用类方法属性的信息,但ValueError本身无法提供此信息。

只是为了进一步解释一下 - 我遇到了一种情况,当方法列表以使用类创建的实例的属性(以及实例的方法)为条件时,所以我有一个简单而标准的句柄。由于不正确地调用实例的方法或属性而导致的错误将是在代码中销售某些分支并在创建“统一”实例时将内存保存在未使用的方法和属性上的真正有效方式。

我在下面输入了一个代码来演示不正确的属性调用,但这同样适用于方法。

#!/usr/bin/python3
import sys

class Number():
    def __init__(self, real, im=0):
        if im == 0:
            self.real=real
        else:
            self.real=real
            self.im=im

x=Number(10)

'''#this part does not work
try:
    print(' x = ', x.real, " + ", x.im, 'i')
except ValueError as err:
    print(err)
'''
try:
    print(' x = ', x.real, " + ", x.im, 'i')
except:
    print(sys.exc_info()[0])

1 个答案:

答案 0 :(得分:1)

AttributeError不是ValueError的子类,因此当您只处理后者时,前者不会被捕获。

如果您需要处理两个例外,请抓住两者:

try:
    print(' x = ', x.real, " + ", x.im, 'i')
except (AttributeError, ValueError) as exc:
    print(exc)

或只是抓住AttributeError

try:
    print(' x = ', x.real, " + ", x.im, 'i')
except AttributeError as exc:
    print(exc)

如果您想捕获(几乎)所有异常,请抓住Exception

except Exception as exc:

但请注意blanket, Pokemon exception handling