### 6. 內建的異常
異常應該是類對象。異常定義在模塊[exceptions](# "exceptions: Standard exception classes.")中。該模塊不需要顯式導入:這些異常在內置命名空間中有提供,就和[exceptions](# "exceptions: Standard exception classes.")模塊一樣。
對于類異常,如果在[try](#)語句的[except](#)子句中提到一個類,該子句還會處理任何從那個類派生的異常類(不是*它*派生自的異常類)。通過子類化得到的兩個不相關的異常類永遠不會相等,即使它們具有相同的名稱。
下面列出的異常可以通過解釋器或內置函數生成。除了提到的那些地方,它們還有"相關聯的值"指示錯誤的詳細的原因。它可能是一個字符串或一個包含幾項信息(例如,錯誤碼和解釋代碼的字符串)的元組。關聯的值為[raise](#)語句的第二個參數。如果異常類派生自標準的根類[BaseException](# "exceptions.BaseException"),關聯的值作為異常實例的args屬性呈現。
用戶代碼可以引發內置異常。這可以用來測試異常處理程序或報告一個錯誤情況,"就像"這種情況下解釋器引起的相同異常;但要注意沒有辦法能阻止用戶代碼引發一個不當的錯誤。
內置的異常類可以創建子類來定義新的異常;程序員應該從[Exception](# "exceptions.Exception")類或它的一個子類而不是從[BaseException](# "exceptions.BaseException")派生新的異常。有關定義異常詳細信息可以訪問Python 教程中的[*用戶定義的異常*](#)。
以下的異常只用作其它異常的基類。
*exception*BaseException
所有內建的異常的基類。它并不意味用戶定義的類應該直接繼承它(為此,請使用[Exception](# "exceptions.Exception"))。如果在該類的一個實例上調用[str()](# "str")或[unicode()](# "unicode"),則返回該實例的參數的表示,沒有參數時返回空字符串。
版本2.5中新增。
args
異常構造函數的參數元組。有些內建的異常(如[IOError](# "exceptions.IOError"))期望一定數量的參數并為此元組的元素分配特殊的含義,而其它異常的調用通常只需要一個單一的字符串來提供一條錯誤消息。
*exception*Exception
所有內置的、 非系統退出異常是從該類派生的。此外應該從該類派生所有用戶定義的異常。
2.5 版本中的更改:更改為從[BaseException](# "exceptions.BaseException")繼承。
*exception*StandardError
除[StopIteration](# "exceptions.StopIteration")、[GeneratorExit](# "exceptions.GeneratorExit")、[KeyboardInterrupt](# "exceptions.KeyboardInterrupt")和[SystemExit](# "exceptions.SystemExit")以外的所有內置異常的基類。[StandardError](# "exceptions.StandardError")本身繼承自[Exception](# "exceptions.Exception")。
*exception*ArithmeticError
各種算術錯誤引發的內置異常的基類:[OverflowError](# "exceptions.OverflowError")、[ZeroDivisionError](# "exceptions.ZeroDivisionError")、[FloatingPointError](# "exceptions.FloatingPointError")。
*exception*BufferError
當[*緩沖區*](#)相關的操作無法執行時引發。
*exception*LookupError
當用于映射或序列的鍵或索引無效時引發的異常的基類:[IndexError](# "exceptions.IndexError")、[KeyError](# "exceptions.KeyError")。可以直接通過[codecs.lookup()](# "codecs.lookup")引發。
*exception*EnvironmentError
Python系統以外發生的異常的基類:[IOError](# "exceptions.IOError")、[OSError](# "exceptions.OSError")。當用2元組創建這種類型的異常時,第一項可以通過實例的[errno](# "errno: Standard errno system symbols.")屬性訪問(它被假設為一個錯誤編號),第二個項目是可通過strerror屬性訪問(它通常與錯誤消息關聯)。元組本身也是可用的args屬性上的。
1.5.2 版中新增。
[EnvironmentError](# "exceptions.EnvironmentError")異常以3元組實例化時,前兩項的訪問和上面一樣,第三項可以通過filename屬性訪問。然而,對于向后兼容性, args屬性包含僅 2 元第一次的兩個構造函數參數。
當該異常以非3個參數創建時,filename屬性為None。當實例不是以2個或3個參數創建時,[errno](# "errno: Standard errno system symbols.")和strerror屬性也為None。在最后一種情況下, args以一個元組的形式包含構造函數的原樣參數。
以下是實際中會引發的異常。
*exception*AssertionError
當[assert](#)語句將失敗時引發。
*exception*AttributeError
當屬性引用 (請參見[*屬性引用*](#)) 或分配失敗。(當對象不支持屬性引用或根本屬性分配時, [TypeError](# "exceptions.TypeError")將引發。)
*exception*EOFError
當 ([input ()](# "input")或[raw_input()](# "raw_input")) 的內置函數之一點擊文件結尾 (EOF) 條件下沒有讀取任何數據時引發。(注: [file.read()](# "file.read")和[file.readline()](# "file.readline")的方法返回一個空字符串,當他們擊中 EOF。)
*exception*FloatingPointError
提出當浮動點操作將失敗。此異常其始終定義,但可以當 Python 配置與時的情況下,才會引發— — fpectl 與選項或WANT_SIGFPE_HANDLER符號在pyconfig.h文件中定義。
*exception*GeneratorExit
當調用一種[*發電機*](#)的close ()方法時引發。它直接繼承而不是[StandardError](# "exceptions.StandardError")[BaseException](# "exceptions.BaseException") ,因為它是從技術上講不是一個錯誤。
新版本 2.5 中的。
2.6 版本中的更改:更改為從[BaseException](# "exceptions.BaseException")繼承。
*exception*IOError
O 相關的原因,例如,"未找到文件"或"磁盤已滿"(如[print](#)語句、 內置[open ()](# "open")函數或文件對象的方法) 的 I/O 操作失敗時引發。
此類是從[EnvironmentError](# "exceptions.EnvironmentError")派生的。異常實例屬性請參閱上文討論的詳細信息。
2.6 版本中的更改:改變[socket.error](# "socket.error")把此作為基類。
*exception*ImportError
當[import](#)語句無法找到模塊定義或者時從......引發導入未能找到要導入的名稱。
*exception*IndexError
序列下標超出范圍時引發。(切片索引會被自動截斷落在允許的范圍內 ; 如果索引不是一個普通整數,則引發[TypeError](# "exceptions.TypeError") )。
*exception*KeyError
在現有的鍵的集合中找不到 (詞典) 的映射鍵時引發。
*exception*KeyboardInterrupt
當用戶點擊中斷鍵 (通常控制 C或刪除) 時引發。在執行期間,從理論上進行定期檢查的中斷。中斷類型,當一個內置函數[的 input ()](# "input")或[raw_input()](# "raw_input")等待輸入還引發此異常。異常繼承[BaseException](# "exceptions.BaseException") ,不意外地被捕獲[的異常](# "exceptions.Exception")的代碼捕捉,從而防止該解釋器退出。
2.5 版本中的更改:更改為從[BaseException](# "exceptions.BaseException")繼承。
*exception*MemoryError
當操作耗盡了內存,但情況仍可能獲救 (通過刪除一些對象) 時引發。關聯的值是一個字符串,指示什么樣的 (內部) 操作耗盡了內存。請注意由于底層內存管理結構 (C 的malloc ()函數),口譯員未必能夠完全恢復從這種情況 ;它然而引發異常以便可以打印堆棧回溯,離家出走的程序令的情況下。
*exception*NameError
當找不到本地或全局名稱時引發。這僅適用于不合格的名稱。關聯的值是一條錯誤消息,其中包括找不到的名稱。
*exception*NotImplementedError
此異常是從[RuntimeError](# "exceptions.RuntimeError")派生的。用戶定義基類中抽象方法應引發異常,當他們要求派生的類重寫該方法。
在 1.5.2 版本新。
*exception*OSError
此異常是從[EnvironmentError](# "exceptions.EnvironmentError")派生的。它被提出當一個函數返回與系統相關的錯誤 (不是非法的參數類型或其他附帶的錯誤)。[Errno](# "errno: Standard errno system symbols.")屬性是從errno,一個數字錯誤代碼, strerror屬性是相應的字符串,將印的 C 函數perror ()。請參閱模塊[errno](# "errno: Standard errno system symbols."),其中包含由底層操作系統定義的錯誤代碼的名稱。
對于涉及 (如chdir()或作用是:) 的文件系統路徑的異常,異常實例將包含三個屬性,文件名,這是傳遞給函數的文件的名稱。
在 1.5.2 版本新。
*exception*OverflowError
太大而無法表示算術運算的結果時引發。長整數 (這比放棄,而是會引起[MemoryError](# "exceptions.MemoryError") ),與普通的整數,而是返回一個長整數的大多數操作,就不能發生這種情況。缺乏標準化的浮動點中的異常處理 C,最浮點運算也不會檢查。
*exception*ReferenceError
弱引用代理,由[weakref.proxy()](# "weakref.proxy")函數中,創建用于訪問屬性的指涉后它已被垃圾回收, 時,將引發此異常。弱引用的詳細信息,請參閱[weakref](# "weakref: Support for weak references and weak dictionaries.")模塊。
新版本 2.2 中的:以前稱為[weakref。](# "weakref.ReferenceError")ReferenceError異常。
*exception*RuntimeError
這不會在任何其他類別中檢測到錯誤時引發。關聯的值是一個字符串,指示什么精確地走錯了。
*exception*StopIteration
提出的[*迭代器*](#)的[next ()](# "iterator.next")方法,信號說那里是沒有進一步的值。這是[例外](# "exceptions.Exception"),而不是[StandardError](# "exceptions.StandardError"),從推導出來的因為這被認為是一種不在其正常的應用程序中的錯誤。
新版本 2.2 中的。
*exception*SyntaxError
當解析器遇到語法錯誤時引發。閱讀的最初的腳本或標準輸入 (也是以交互方式) 時,這可能發生在[exec](#)語句中調用內置函數[eval ()](# "eval")或[input ()](# "input"),或[導入](#)的語句中。
此類的實例有屬性文件名、空格符、偏移量和更容易訪問詳細信息的文本。[str()](# "str")的異常實例返回唯一的消息。
*exception*IndentationError
與相關的縮進不正確的語法錯誤的基類。這是[SyntaxError](# "exceptions.SyntaxError")的一個子類。
*exception*TabError
當壓痕包含制表符和空格的使用不一致時引發。這是[IndentationError](# "exceptions.IndentationError")的一個子類。
*exception*SystemError
當譯員發現內部錯誤,但情況看起來不那么嚴重,使它不得不放棄所有希望時引發。關聯的值是一個字符串,指示發生錯誤 (在底層的角度來說)。
你應該向作者或維護者你 Python 解釋器報告。一定要報告的 Python 解釋器版本 (sys.version; 它也印在 Python 的交互式會話開始時),確切的錯誤消息 (異常的關聯值),如果可能的程序源代碼,觸發錯誤。
*exception*SystemExit
由[sys.exit()](# "sys.exit")函數引發此異常。當它不處理時,Python 解釋器退出 ;打印沒有堆棧回溯。如果關聯的值是一個普通整數,它指定系統退出狀態 (傳遞給 C 的exit()函數) ;如果它是None,退出狀態為零 ;如果它有另一種類型 (如字符串),該對象的值印,退出狀態是一個。
實例具有的屬性代碼設置為 (默認情況下沒有) 擬議的退出狀態或錯誤消息。此外,此異常派生直接從[BaseException](# "exceptions.BaseException")和不[StandardError](# "exceptions.StandardError"),因為它不是技術上的錯誤。
對[sys.exit()](# "sys.exit")的調用被翻譯成異常,以便可以執行清理處理程序 ([最后](#)條款[try](#)語句),并且,以便調試器可以執行一個腳本不運行失控的風險。如果它是絕對有必要退出立即 (例如,在子進程后對[os.fork()](# "os.fork")的調用),可以使用[os._exit()](# "os._exit")函數。
異常繼承[BaseException](# "exceptions.BaseException")而不是[StandardError](# "exceptions.StandardError")或[異常](# "exceptions.Exception"),以便不意外地被捕獲[的異常](# "exceptions.Exception")的代碼。這允許將異常正確傳播起來并導致該解釋器退出。
2.5 版本中的更改:更改為從[BaseException](# "exceptions.BaseException")繼承。
*exception*TypeError
當操作或函數應用于不合適類型的對象時引發。關聯的值是字符串,它提供有關類型不匹配的詳細信息。
*exception*UnboundLocalError
當提及到一個本地變量在函數或方法,但沒有值已綁定到該變量時引發。這是[NameError](# "exceptions.NameError")的一個子類。
在 2.0 版中的新。
*exception*UnicodeError
有關 Unicode 編碼或解碼錯誤出現時引發。它是[ValueError](# "exceptions.ValueError")的一個子類。
[UnicodeError](# "exceptions.UnicodeError")具有描述編碼或解碼錯誤的屬性。例如, err.object[err.start:err.end]給出了所編解碼器的失敗與特定的無效輸入。
encoding
引發錯誤編碼的名稱。
reason
描述特定的編碼解碼器錯誤的字符串。
object
編解碼器對象試圖進行編碼或解碼。
start
第一個索引的[對象](# "object")中的數據無效。
end
后最后一個無效的數據[對象](# "object")中的索引。
在 2.0 版中的新。
*exception*UnicodeEncodeError
編碼過程中出現的一個 Unicode 相關的錯誤時引發。它是[UnicodeError](# "exceptions.UnicodeError")的一個子類。
新版本 2.3。
*exception*UnicodeDecodeError
解碼過程中出現的一個 Unicode 相關的錯誤時引發。它是[UnicodeError](# "exceptions.UnicodeError")的一個子類。
新版本 2.3。
*exception*UnicodeTranslateError
在翻譯過程中出現的一個 Unicode 相關的錯誤時引發。它是[UnicodeError](# "exceptions.UnicodeError")的一個子類。
新版本 2.3。
*exception*ValueError
當內置操作或功能接收具有正確的類型,但不正確的值,這樣一種說法,這種情況不描述的更精確異常 (如[IndexError](# "exceptions.IndexError")時引發。
*exception*VMSError
僅在 VM 上可用。當 VM 特定錯誤時引發。
*exception*WindowsError
Windows 特定的錯誤發生時,或者是錯誤號碼不對應errno值時引發。Winerror和strerror的值創建的GetLastError()和FormatMessage()的功能,從 Windows 平臺 API 的返回值。[Errno](# "errno: Standard errno system symbols.")值將winerror值映射到相應的errno.h值。這是[OSError](# "exceptions.OSError")的一個子類。
在 2.0 版中的新。
2.5 版本中的更改:以前的版本放入[errno](# "errno: Standard errno system symbols.")的GetLastError()代碼。
*exception*ZeroDivisionError
當一個司或取模操作的第二個參數是零時引發。關聯的值是一個字符串,指示的操作數和操作的類型。
以下異常作為警告類別使用;詳細信息請參閱[warnings](# "warnings: Issue warning messages and control their disposition.")模塊。
*exception*Warning
警告類的基類。
*exception*UserWarning
對于由用戶代碼生成警告的基類。
*exception*DeprecationWarning
有關已棄用功能的警告的基類。
*exception*PendingDeprecationWarning
警告有關將在未來被否決的功能的基類。
*exception*SyntaxWarning
警告有關可疑語法的基類
*exception*RuntimeWarning
基類有關可疑的運行時行為的警告。
*exception*FutureWarning
基類構造,它們會在未來發生語義變化有關的警告。
*exception*ImportWarning
導入模塊中可能錯誤的警告的基類。
2.5 版中新增。
*exception*UnicodeWarning
Unicode相關的警告的基類。
2.5 版中新增。
### 6.1. 異常的層次結構
內置異常的類層次結構是:
~~~
BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration
+-- StandardError
| +-- BufferError
| +-- ArithmeticError
| | +-- FloatingPointError
| | +-- OverflowError
| | +-- ZeroDivisionError
| +-- AssertionError
| +-- AttributeError
| +-- EnvironmentError
| | +-- IOError
| | +-- OSError
| | +-- WindowsError (Windows)
| | +-- VMSError (VMS)
| +-- EOFError
| +-- ImportError
| +-- LookupError
| | +-- IndexError
| | +-- KeyError
| +-- MemoryError
| +-- NameError
| | +-- UnboundLocalError
| +-- ReferenceError
| +-- RuntimeError
| | +-- NotImplementedError
| +-- SyntaxError
| | +-- IndentationError
| | +-- TabError
| +-- SystemError
| +-- TypeError
| +-- ValueError
| +-- UnicodeError
| +-- UnicodeDecodeError
| +-- UnicodeEncodeError
| +-- UnicodeTranslateError
+-- Warning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- RuntimeWarning
+-- SyntaxWarning
+-- UserWarning
+-- FutureWarning
+-- ImportWarning
+-- UnicodeWarning
+-- BytesWarning
~~~
- Python 2 教程
- 1. 吊吊你的胃口
- 2. Python 解釋器
- 3. Python簡介
- 4. 控制流
- 5. 數據結構
- 6. 模塊
- 7. 輸入和輸出
- 8. 錯誤和異常
- 9. 類
- 10. 標準庫概覽
- 11. 標準庫概覽 — 第II部分
- 12.現在怎么辦?
- 13. 交互式輸入的編輯和歷史記錄
- 14. 浮點數運算:問題和局限
- Python 2 標準庫
- 1. 引言
- 2. 內建函數
- 3. 不太重要的內建函數
- 4. 內建的常量
- 5. 內建的類型
- 6. 內建的異常
- 7. String Services
- 8. Data Types
- 9. Numeric and Mathematical Modules
- 10. File and Directory Access
- 11. Data Persistence
- 13. File Formats
- 14. Cryptographic Services
- 15. Generic Operating System Services
- 16. Optional Operating System Services
- 17. Interprocess Communication and Networking
- 18. Internet Data Handling
- 20. Internet Protocols and Support
- 26. Debugging and Profiling
- 28. Python Runtime Services
- Python 2 語言參考
- 1. 簡介
- 2. 詞法分析
- 3. 數據模型
- 4. 執行模型
- 5. 表達式
- 6. 簡單語句
- 7. 復合語句
- 8. 頂層的組件
- 9. 完整的語法規范
- Python 3 教程
- 1. 引言
- 2. Python 解釋器
- 3. Python簡介
- 4. 控制流
- 5. 數據結構
- 6. 模塊
- 7. 輸入和輸出
- 8. 錯誤和異常
- 9. 類
- 10. 標準庫概覽
- 11. 標準庫概覽 — 第II部分
- 12.現在怎么辦?
- 13. 交互式輸入的編輯和歷史記錄
- 14. 浮點數運算:問題和局限