簡體   English   中英

除了 BaseException 和except BaseException 有什么區別

[英]What is the difference between except and except BaseException

這兩者有什么區別:

except:
    # do something

except BaseException as be:
    print(be)

我的意思是在第一種情況下所有可能的異常都被捕獲,但第二種情況是否如此?

也可以使用第一種情況打印錯誤消息嗎?

實際上,對於任何當前的 Python 版本, except:except BaseException:之間沒有區別

那是因為您不能將任何類型的對象作為異常引發。 raise語句明確禁止引發其他任何事情:

[...] raise 將第一個表達式計算為異常對象。 它必須是BaseException的子類或實例。

大膽強調我的。 然而,情況並非總是如此,在較舊的 Python 版本(2.4 及更早版本)中,您也可以使用字符串作為異常。

這樣做的好處是您可以輕松訪問捕獲的異常。 為了能夠添加as targetname ,您必須捕獲特定類別的異常,並且只有BaseException會這樣做。

您仍然可以使用sys.exc_info()訪問當前活動的異常:

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

選擇你覺得對你未來的自己和你的同事更易讀的東西。

接受的答案完整(至少對於 Python 3.6 及更高版本)。

通過捕獲Exception您可以捕獲大多數錯誤——基本上是您使用的任何模塊可能拋出的所有錯誤。

通過捕獲BaseException ,除了上述所有異常之外,您還可以捕獲SystemExitKeyboardInterruptGeneratorExit類型的異常。

例如,通過捕獲KeyboardInterrupt ,您可以在用戶發起退出后阻止代碼退出(例如在控制台中按^C或在某些解釋器上停止啟動的應用程序)。 這可能是一種想要的行為(例如 - 記錄退出),但應格外小心使用!

在上面的示例中,通過捕獲BaseException ,您可能會導致應用程序在您希望退出時掛起。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM