【问题标题】:How to handle multiple exception in a try block? [duplicate]如何处理 try 块中的多个异常? [复制]
【发布时间】:2019-11-03 07:06:12
【问题描述】:

让我们假设,一个代码由近 50 行组成,它有一个 try 块。考虑try 块有10 个未知错误的情况。是否可以在不指定 except 子句中的错误名称的情况下处理这些异常?

这里是示例代码:

try:
    a = 2
    b = 2 / 0
    if 7 > 5:
        print(7)
except(ZeroDivisionError, IndentationError)
    print("Exception Handled")

在上述情况下,我知道 try 块中发生的错误的名称(比如-ZeroDivisionErrorIndentationError) 如果错误名称未知怎么办?

【问题讨论】:

  • except Exception 捕获所有异常
  • 请注意,关于@DeveshKumarSingh,您通常不想捕获一般的Exception,因为这样您将很难在代码中发现错误。
  • 是的,我试过了,但我仍然遇到运行时错误
  • 您尝试了什么,请将其添加到问题中,并且您在 except 子句中缺少:
  • 根据这里的答案:stackoverflow.com/questions/6470428/… - except (ZeroDivisionError, IndentationError) as e: # do stuff

标签: python exception


【解决方案1】:

异常层次结构

大多数异常都是 Exception 类的子类。但并非所有例外都是如此。 Exception 本身实际上继承自一个名为 BaseException 的类。事实上,所有异常都必须扩展 BaseException 类或其子类之一。

Exception直接派生自BaseException,而我们处理的异常通常派生自Exception。有两个关键异常,SystemExitKeyboardInterrupt,它们直接从 BaseException 而不是 Exception 派生。当我们使用except:子句而不指定任何类型的异常时,它会捕获BaseException的所有子类;也就是说,它将捕获所有异常,包括两个特殊的异常

所以,不要使用except:,使用:

try:
    # thing you want to try
except Exception:
    # handle exception

编辑:

try:
    a = 2
    print("The next step the program will catch an exception.")
    b = 2 / 0
    if 7 > 5:
        print("This will never run.")
        print(7)
except Exception:
    print("Exception Handled")

【讨论】:

    【解决方案2】:

    将所有你想捕获的异常放在一个 tuple 中,如下所示:

    try:
        a = 2
        b = 2 / 0
        if 7 > 5:
            print(7)
    except (ZeroDivisionError, IndentationError) as e:
        print("Exception:", e)
    

    输出:Exception: division by zero

    【讨论】:

    • 我的问题是处理异常而不在except子句中指定它
    • 哦,我明白了,我的错。全能希思克利夫的答案可能就是你想要的。它捕获所有异常。不过,你有什么想法? “如果错误的名称未知怎么办”为什么它可能是未知的?
    【解决方案3】:
    try:
       #maliciousCodeFound
    except:
       #catches ANY exception
    

    except here 捕获 try 块中遇到的每个错误,您不需要指定异常类型。 但是,如果您想捕获和处理特定类型的异常(例如算术异常),您可能想使用它来处理该特定情况。否则,只需使用 except。

    【讨论】:

    • 使用通用的except 是不好的做法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    相关资源
    最近更新 更多