Python 2 documentation表示「鼓勵程序員從Exception類或它的一個子類派生新的異常,而不是從BaseException派生」。沒有進一步解釋爲什麼。爲什麼建議從Python派生Exception而不是BaseException類?
我很好奇爲什麼這樣推薦?像Python開發人員所設想的那樣,它只是保留exceptions hierarchy嗎?從BaseException
衍生
Python 2 documentation表示「鼓勵程序員從Exception類或它的一個子類派生新的異常,而不是從BaseException派生」。沒有進一步解釋爲什麼。爲什麼建議從Python派生Exception而不是BaseException類?
我很好奇爲什麼這樣推薦?像Python開發人員所設想的那樣,它只是保留exceptions hierarchy嗎?從BaseException
衍生
例外的是:GeneratorExit
,KeyboardInterrupt
,SystemExit
。
根據文檔:
GeneratorExit
:當引發發電機的close()方法被調用。它直接從BaseException繼承而不是StandardError,因爲它在技術上不是錯誤。KeyboardInterrupt
:當用戶點擊中斷鍵時(通常是Control-C或Delete)引發。在執行期間,會定期檢查中斷。當內建函數input()或raw_input()正在等待輸入時鍵入中斷也會引發此異常。 該異常繼承自BaseException,以防意外被捕獲異常的代碼捕獲,從而阻止解釋器退出。SystemExit
:該異常繼承自BaseException而不是StandardError或Exception,以便它不會被捕獲異常的代碼意外捕獲。 這允許異常正確傳播並導致解釋器退出。所以,通常的原因是防止意外try ... except Exception
防止解釋出口(除GeneratorExit
)
UPDATE看到阿什維尼喬杜裏的評論後:
PEP 352 - Required Superclass for Exceptions解釋了原因。
由於它具有 基本根,因此異常層次結構變得更加重要,因此需要對現有層次結構進行更改。現在,如果想要捕獲所有表示錯誤 的異常並且不意味着應允許解釋器退出,則必須在除外條款中明確指定除兩個以外的所有情況(除兩個外)或 分別捕獲兩個異常然後重新提出來,並有 所有其它異常始終陷入裸except子句:
except (KeyboardInterrupt, SystemExit): raise except: ...
也就是說不必要明確。此PEP建議將KeyboardInterrupt和SystemExit直接從 BaseException繼承。
[PEP 352](https://www.python.org/dev/peps/pep-0352/)非常多地解釋它。 –