Python: 如何从同名字符串中获取异常作为对象?
Python: How to get exception as an object from a string with the same name?
假设我有包含异常名称的字符串:
s1 = 'KeyError'
s2 = 'ArithmeticError'
s3 = 'OSError'
s4 = 'ZeroDivisionError'
.....
sn = 'SomeOtherError'
我需要做的是:
if issubclass(s4, (s1, s2, s3, sn)) == True:
print('You dont have to catch this exception because the parent is already caught')
出于某种原因,在这种情况下使用 globals()
无济于事。由于我不是一个有经验的程序员,我只能猜测这是因为那些是内置的异常...
尽管如此,要实现我想要实现的目标,可以做些什么?
如有任何建议,我们将不胜感激!
globals()
会起作用,如果你使用正确的话:
getattr(globals()['__builtins__'], 'KeyError')
<class 'KeyError'>
最可靠的方法可能是搜索 class 层次结构。所有内置异常最终都是 BaseException
的后代,因此只需递归搜索其子代即可:
def find_child_class(base, name):
if base.__name__ == name:
return base
for c in base.__subclasses__():
result = find_child_class(c, name)
if result:
return result
>>> find_child_class(BaseException, 'KeyError')
<class 'KeyError'>
这也适用于用户定义的异常,只要定义它们的模块已加载并且异常派生自 Exception
(它们应该是)。
假设我有包含异常名称的字符串:
s1 = 'KeyError'
s2 = 'ArithmeticError'
s3 = 'OSError'
s4 = 'ZeroDivisionError'
.....
sn = 'SomeOtherError'
我需要做的是:
if issubclass(s4, (s1, s2, s3, sn)) == True:
print('You dont have to catch this exception because the parent is already caught')
出于某种原因,在这种情况下使用 globals()
无济于事。由于我不是一个有经验的程序员,我只能猜测这是因为那些是内置的异常...
尽管如此,要实现我想要实现的目标,可以做些什么?
如有任何建议,我们将不胜感激!
globals()
会起作用,如果你使用正确的话:
getattr(globals()['__builtins__'], 'KeyError')
<class 'KeyError'>
最可靠的方法可能是搜索 class 层次结构。所有内置异常最终都是 BaseException
的后代,因此只需递归搜索其子代即可:
def find_child_class(base, name):
if base.__name__ == name:
return base
for c in base.__subclasses__():
result = find_child_class(c, name)
if result:
return result
>>> find_child_class(BaseException, 'KeyError')
<class 'KeyError'>
这也适用于用户定义的异常,只要定义它们的模块已加载并且异常派生自 Exception
(它们应该是)。