【问题标题】:Python one exception multiple handlersPython 一个异常多个处理程序
【发布时间】:2015-04-26 09:42:00
【问题描述】:

我想这样做:

try:
    raise A()
except A:
    print 'A'
except (A, B):
    print 'A,B'

我希望同时打印A 和A,B。

这不起作用(只执行第一个except)。第一个 except 吞下错误是有道理的,以防您想在子类成为父类之前捕获它。

但是还有另一种优雅的方法可以让它工作吗?

我当然可以执行以下操作,但这似乎是多余的代码重复,特别是如果涉及的不仅仅是 A 和 B:

try:
    raise A()
except A:
    print 'A'
    print 'A,B'
except B:
    print 'A,B'

(与Multiple exception handlers for the same Exception相关,但不重复。用法不同,我想知道如何以最少的代码重复最好地处理它。)

【问题讨论】:

  • @vaultah(为什么)你删除了你的答案?
  • 我做了,因为我对此不满意。
  • 异常只和A有关的情况下为什么要打印A、B?
  • @PadraicCunningham:except (A, B) 的异常也可能与B 有关。
  • 为什么不只是 catch (exceptions...) as e 并打印 e.whatever

标签: python exception coding-style paradigms


【解决方案1】:

捕获可能的异常并稍后从实例中获取异常类型是很常见的:

try:
    raise A()
except (A, B) as e:
    if isinstance(e, A):
        print('A')
    print('A', 'B')

另一种选择是从另一个类继承一个类,例如

class B(Exception):
    def do(self):
        print('A', 'B')

class A(B, Exception):
    def do(self):
        print('A')
        super().do()

然后

try:
    raise B()
except (A, B) as e:
    e.do()

将打印A B,并且

try:
    raise A()
except (A, B) as e:
    e.do()

将打印A 和A B。

【讨论】:

  • 我不是这种风格的忠实粉丝,但似乎这是最接近的方式
  • @Mark 查看更新,我添加了另一个可能的选项
  • 可能很有用,但我认为错误处理代码通常与错误对象的相关性不足以使其成为方法。不过,偶尔还是有用的。
【解决方案2】:

您可以使用嵌套的 try-except-blocks:

try:
    try:
        raise A()
    except A:
        print 'A'
        raise
except (A, B):
    print 'A,B'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多