[英]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
,除了上述所有異常之外,您還可以捕獲SystemExit
、 KeyboardInterrupt
和GeneratorExit
類型的異常。
例如,通過捕獲KeyboardInterrupt
,您可以在用戶發起退出后阻止代碼退出(例如在控制台中按^C
或在某些解釋器上停止啟動的應用程序)。 這可能是一種想要的行為(例如 - 記錄退出),但應格外小心使用!
在上面的示例中,通過捕獲BaseException
,您可能會導致應用程序在您希望退出時掛起。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.