说我有一个可以产生各种各样错误的函数。
我有一个需要捕获的ValueError,一个特定的AttributeError,然后还需要处理任何其他类型的错误。
try:
func()
except AttributeError as e:
if "specific error text" in str(e):
print("The specific AttributeError occurred")
else:
raise
except ValueError:
print("A value error occurred")
except Exception as e:
print("Another error occurred: {}".format(str(e)))
问题:如果func()
冒出的AttributeError
不是我要寻找的特定对象,在这种情况下,它将重新筹集并没有按照我希望的方式处理(通过常规Exception
处理程序。)
如何在不将代码从Exception
部分复制到AttributeError
部分的情况下,在链中进一步处理非特定错误?
答案 0 :(得分:1)
基本上,您需要先处理特定的错误。从更一般到更具体,即Exception => AttributeError => YourError
>>> try:
... raise MyCustomAttrErr("Hey, this failed!")
... except MyCustomAttrErr as e:
... print(e)
... except AttributteError as e:
... print("Attribute error raised")
... except Exception as e:
... print("Base exception raised")
...
Hey, this failed!
Python从上到下依次处理except
块,并在捕获它的第一个块中停止。
答案 1 :(得分:1)
作为一种选择,您可以在一个AttributeError
-ValueError
块中处理try
和except
,并在诸如此类的顶层其他所有Exception
中处理>
try:
try:
func()
except AttributeError as e:
if "specific error text" in str(e):
print("The specific AttributeError occurred")
else:
raise
except ValueError:
print("A value error occurred")
except Exception as e:
print("Another error occurred: {}".format(str(e)))
这看起来可能有点难看,所以我们可以在类似的单独函数中提取内部try
-except
块
def func_with_expected_exceptions_handling():
try:
func()
except AttributeError as e:
if "specific error text" in str(e):
print("The specific AttributeError occurred")
else:
raise
except ValueError:
print("A value error occurred")
然后是
try:
func_with_expected_exceptions_handling()
except Exception as e:
print("Another error occurred: {}".format(str(e)))
这并不能使我们脱离实际的嵌套结构,但是如果这种func
处理在其他地方出现,它可能会派上用场。
顺便说一句,我不认为检查异常中的特定错误消息不是一个好主意,我们需要更多的上下文来看看它是否可以更轻松地完成。
如果我正确理解您的func
的样子
def func(...):
getattr(COMMANDS, cmd.command).command(irc_c, msg, cmd)
,您想处理getattr
调用中的错误。
我可以在这里看到下一个选项:
在try
-except
中包装getattr
调用并就地处理AttributeError
def func(...):
try:
commander = getattr(COMMANDS, cmd.command)
except AttributeError:
print('Command {} not found'.format(cmd.command))
else:
commander.command(irc_c, msg, cmd)
在getattr
-try
中包装except
调用,重新引发自定义异常(或ValueError
),然后在OP {{1}中对其进行处理}-try
except
使用class CommandNotFound(Exception): pass
def func(...):
try:
commander = getattr(COMMANDS, cmd.command)
except AttributeError:
raise CommandNotFound() # or we can use `ValueError` instead
else:
commander.command(irc_c, msg, cmd)
函数的default
参数并在那里进行某种记录
getattr
然后使用类似
class DefaultCommand:
def command(self, irc_c, msg, cmd):
print("Command {} is not found".format(cmd.command))