【问题标题】:Handling an error within an exception in Python 2?在 Python 2 中处理异常中的错误?
【发布时间】:2017-09-04 20:20:06
【问题描述】:

我的代码会像这样绘制异常:

try:
    causeEitherError1orError2
except Error1:
    handle Error1
    cause Error2
except Error2:
    handle Error2

尝试操作 A 会导致 Error1 或 Error2。处理 Error1 有时会导致 Error2。当 Error2 可能由原始尝试或错误 1 ​​引起时,如何处理 Error1 和 Error2?

【问题讨论】:

  • 当你说你想“处理”一个错误是什么意思:(a)忽略错误并采取一些其他措施;或者 (b) 采取其他行动然后再加注?在您的示例伪代码中,最后一行应该是handle Error2 而不是cause Error2
  • @FMc 我想做(b)采取其他行动并再次加注。是的,我的意思是处理 Error2 不会再次导致它!

标签: python python-2.7 error-handling


【解决方案1】:

一般来说,这似乎是一个复杂的设计,但您确实可以使用一个 except 大括号捕获多个异常。您还可以嵌套 try-except 处理程序以发挥您的优势。一种可能的设计是:

try:
    ... # action A
except (Error1, Error2) as e:
    try:
        ... # handle e
    except Error2 as f:
        ... # handle f

如果你想知道Exception第一次提出了什么,你可以随时检查类型:

print(type(e)) # prints Error1 or Error2 depending on what was raised

或者,更准确地说,使用isinstance 检查缩小范围:

if isinstance(e, Error1):
    ... # handle e as Error1
else:
    ... # handle e as Error2

【讨论】:

  • 请注意,如果您尝试将e特定异常类型 进行比较,isinstance 是更好的选择。
  • @ChristianDean 是的,这样更好!谢谢。
【解决方案2】:

我认为您的错误处理程序甚至不应该再次导致错误。这似乎是一个奇怪的设计。不过,您可以通过声明一个处理每个错误并可能迭代地调用它的函数来解决这个问题。但这将导致一个巨大的问题:如果您正在调用您的函数进行成像,则会导致错误类型 1,对其进行处理并在此期间引发错误 2。对此的处理再次导致类型 1 错误,依此类推。由于没有尽头,您将得到堆栈溢出。

您可以为函数的全局错误级别添加某种错误级别计数器,通过在错误处理程序中引发错误来增加该计数器。然后您可以添加某种限制,在该限制处错误处理将停止。

【讨论】:

    【解决方案3】:

    如果try: .. except Error1: 的整个块都可以引发Error2,那么整个尝试除了应该在另一个尝试中:

    try:
        try:
            causeEitherError1orError2
        except Error1:
            handle Error1
            cause Error2
    except Error2:
        handle Error2
    

    这样可以正确地引发和捕获两个错误。

    【讨论】:

      【解决方案4】:

      这似乎是一个奇怪的情况,但我可以想象在处理网络请求时这样的事情是必要的。你可以试试这样的结构:

      try:
          causeEitherError1orError2
      except (Error1, Error2) as e:
          try:
              handle e
          except Error2 as q:
              handle q
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-29
        • 1970-01-01
        • 1970-01-01
        • 2013-11-03
        • 2021-09-16
        • 1970-01-01
        相关资源
        最近更新 更多