【问题标题】:What is the difference between except and except BaseException除了 BaseException 和 except 有什么区别
【发布时间】:2017-11-23 03:54:23
【问题描述】:

这两者有什么区别:

except:
    # do something

except BaseException as be:
    print(be)

我的意思是在第一种情况下,所有可能的异常都被捕获,但第二种情况是这样吗?

也可以使用第一种情况打印错误信息吗?

【问题讨论】:

    标签: python exception-handling


    【解决方案1】:

    实际上,对于任何当前的 Python 版本,except:except BaseException: 之间没有区别

    那是因为您不能只将任何类型的对象作为异常引发。 raise statement 明确禁止引发其他任何事情:

    [...] raise 将第一个表达式计算为异常对象。 它必须是BaseException 的子类或实例。

    我的大胆强调。然而,情况并非总是如此,在较旧的 Python 版本(2.4 及之前)中,您也可以使用 strings 作为例外。

    这样做的好处是您可以轻松访问捕获的异常。 为了能够添加as targetname,您必须捕获特定类别的异常,并且只有BaseException 会这样做。

    您仍然可以使用sys.exc_info() 访问当前活动的异常:

    except:
        be = sys.exc_info()[1] 
    

    选择你认为对你未来的自己和你的同事更易读的东西。

    【讨论】:

    • 除非你之前没有放 BaseException = ValueError 这样的东西 ;-) except: 保证总是除了任何错误。
    • @a_guest:是的,name仍然可以被反弹。 builtins.BaseException 是一个不错的后备方案,但也不是万无一失的。
    • except Exceptionexcept BaseException 有何不同?
    • @MaggieYing: ExceptionBaseException 的子类,但它不是唯一的此类子类。还有其他子类,请参阅inheritance diagram in the docs;这些其他异常并不是真正的错误,而是表明您通常不会捕获的信号。
    • 感谢@MartijnPieters,图表很有帮助!
    【解决方案2】:

    接受的答案是不正确不完整(至少对于 Python 3.6 及更高版本)。

    通过捕获Exception,您可以捕获大多数错误 - 基本上是您使用的任何模块可能抛出的所有错误。

    通过捕获BaseException,除了上述所有异常之外,您还可以捕获SystemExitKeyboardInterruptGeneratorExit 类型的异常。

    例如,通过捕获KeyboardInterrupt,您可以在用户发起退出后阻止您的代码退出(例如在控制台中按^C,或在某些解释器上停止启动的应用程序)。这可能是一种需要的行为(例如 - 记录退出),但应格外小心!

    在上面的示例中,通过捕获BaseException,您可能会导致应用程序在您希望退出时挂起。

    【讨论】:

    • 接受的答案是完全正确。但是,如果没有此答案中提到的警告,它是不完整的,因此感谢您指出这一点。
    • @itsadok 你是对的。我改变了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2011-07-04
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    相关资源
    最近更新 更多