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(它们应该是)。