2015-01-17 40 views
6

Python 2 documentation表示「鼓勵程序員從Exception類或它的一個子類派生新的異常,而不是從BaseException派生」。沒有進一步解釋爲什麼。爲什麼建議從Python派生Exception而不是BaseException類?

我很好奇爲什麼這樣推薦?像Python開發人員所設想的那樣,它只是保留exceptions hierarchy嗎?從BaseException衍生

​​
+2

[PEP 352](https://www.python.org/dev/peps/pep-0352/)非常多地解釋它。 –

回答

10

例外的是:GeneratorExitKeyboardInterruptSystemExit

根據文檔:

  • 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繼承。

相關問題