如何在Python3中仅捕获特定错误?

时间:2019-04-17 03:31:13

标签: python-3.x error-handling

说我有一个可以产生各种各样错误的函数。

我有一个需要捕获的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部分的情况下,在链中进一步处理非特定错误?

2 个答案:

答案 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块中处理tryexcept,并在诸如此类的顶层其他所有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))