Python異常處理體系簡介

來源:互聯網
上載者:User

Python內建異常體繫結構
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

捕獲異常的方式

方法一:捕獲所有的異常

 ''' 捕獲異常的第一種方式,捕獲所有的異常 '''
try:
a = b
b = c
except Exception,data:
print Exception,":",data
'''輸出:<type 'exceptions.Exception'> : local variable 'b' 
referenced before assignment ''

方法二:採用traceback模組查看異常,需要匯入traceback模組

''' 捕獲異常的第二種方式,使用traceback查看異常 '''
try:
a = b
b = c
except:
print traceback.print_exc()
'''輸出: Traceback (most recent call last):
File "test.py", line 20, in main
a = b
UnboundLocalError: local variable 'b' referenced before assignmen

方法三:採用sys模組回溯最後的異常

''' 捕獲異常的第三種方式,使用sys模組捕獲異常 '''
try:
a = b
b = c
except:
info = sys.exc_info()
print info
print info[0]
print info[1]
'''輸出:
(<type 'exceptions.UnboundLocalError'>, UnboundLocalError("local 
variable 'b' referenced before assignment",),
<traceback object at 0x00D243F0>)
<type 'exceptions.UnboundLocalError'>
local variable 'b' referenced before assignment
'''

Python異常體系介紹

  Python的異常處理可以向使用者準確反饋出錯資訊,所有異常都是基類Exception的子類。自訂異常都是從基類Exception中繼承。Python自動將所有內建的異常放到內建命名空間中,所以程式不必匯入exceptions模組即可使用異常。

  可以使用的語句結構形式:

  方式一:使用try,except語句來捕獲異常,可以有無數個except語句來處理異常,如果所有except語句都沒捕獲到,則拋出異常到調用此方法的函數內處理,直到系統的主函數來處理。

  使用except子句需要注意的事情,就是多個except子句截獲異常時,如果各個異常類之間具有繼承關係,則子類應該寫在前面,否則父類將會直接截獲子類異常。放在後面的子類異常也就不會執行到了。

try:
block
except [excpetion,[data...]]:
block
except [excpetion,[data...]]:
block
except [excpetion,[data...]]:
block

  方式二:當沒有異常發生的時候執行else語句

try:
block
except  [excpetion,[data...]]:
block
else:
block

  方式三:finally 語句,不管有沒有發生異常都將執行finally語句塊

  例如我們在python中開啟一個檔案進行讀寫操作,我在操作過程中不管是否出現異常,最終都是要把該檔案關閉的。

try:
block
finally:
block

  方式四:try,except,finally

try:
block
except:
block
finally:
block

  引發異常

  raise [exception[,data]]

  在Python中,要想引發異常,最簡單的形式就是輸入關鍵字raise,後跟要引發的異常的名稱。

  異常名稱標識出具體的類:Python異常是那些類的對象。執行raise語句時,Python會建立指定的異常類的一個對象。

  raise語句還可指定對異常對象進行初始化的參數。為此,請在異常類的名稱後添加一個逗號以及指定的參數(或者由參數構成的一個元組)。

  例:

try:
raise MyError #自己拋出一個異常
except MyError:
print 'a error'

raise ValueError,’invalid argument’

  捕捉到的內容為:

type  = VauleError
message = invalid argument

  異常處理的一些其它用途

  除了處理實際的錯誤條件之外,對於異常還有許多其它的用處。在標準 Python 庫中一個普通的用法就是試著匯入一個模組,然後檢查是否它能使用。

  匯入一個並不存在的模組將引發一個 ImportError 異常。你可以使用這種方法來定義多層級的功能――依靠在運行時哪個模組是有效,或支援多種平台 (即平台特定代碼被分離到不同的模組中)。

  你也能通過建立一個從內建的 Exception 類繼承的類定義你自己的異常,然後使用 raise 命令引發你的異常。如果你對此感興趣,請看進一步閱讀的部分。

  下面的例子示範了如何使用異常支援特定平台功能。代碼來自 getpass 模組,一個從使用者獲得口令的封裝模組。獲得口令在 UNIX、Windows 和 Mac OS 平台上的實現是不同的,但是這個代碼封裝了所有的不同之處。

  例支援特定平台功能

# Bind the name getpass to the appropriate function

try:
import termios, TERMIOS                    
except ImportError:
try:
import msvcrt                          
except ImportError:
try:
from EasyDialogs import AskPassword
except ImportError:
getpass = default_getpass          
else:                                  
getpass = AskPassword
else:
getpass = win_getpass
else:
getpass = unix_getpass

  termios 是 UNIX 專屬的一個模組,它提供了對於輸入終端的底層控制。

  如果這個模組無效 (因為它不在你的系統上,或你的系統不支援它),則匯入失敗,Python 引發我們捕捉的 ImportError 異常。

  OK,我們沒有 termios,所以讓我們試試 msvcrt,它是 Windows 專屬的一個模組,可以提供在 Microsoft Visual C++ 運行服務中的許多有用的函數的一個API。如果匯入失敗,

  Python 會引發我們捕捉的 ImportError 異常。

  如果前兩個不能工作,我們試著從 EasyDialogs 匯入一個函數,它是 Mac OS 專屬的一個模組,提供了各種各樣類型的彈出對話方塊。再一次,如果匯入失敗,Python 會引發一個我們捕捉的 ImportError 異常。

   這些平台特定的模組沒有一個有效 (有可能,因為 Python 已經移植到了許多不同的平台上了),所以我們需要回頭使用一個預設口令輸入函數 (這個函數定義在 getpass 模組中的別的地方)。注意我們在這裡所做的:我們將函數 default_getpass 賦給變數 getpass。如果你讀了官方 getpass 文檔,它會告訴你 getpass 模組定義了一個 getpass 函數。它是這樣做的:通過綁定 getpass 到正確的函數來適應你的平台。然後當你調用 getpass 函數時,你實際上調用了平台特定的函數,是這段代碼已經為你設定好的。你不需要知道或關心你的代碼正運行在何種平台上;只要調用 getpass,則它總能正確處理。

  一個 try...except 塊可以有一條 else 子句,就像 if 語句。如果在 try 塊中沒有異常引發,然後 else 子句被執行。在本例中,那就意味著如果 from EasyDialogs import AskPassword 匯入可工作,所以我們應該綁定 getpass 到 AskPassword 函數。其它每個 try...except 塊有著相似的 else 子句,當我們發現一個 import 可用時,就綁定 getpass 到適合的函數。

  自訂異常類,繼承Exception類及其子類

class MyError( ArithmeticError ):
pass

class MyError2 ( Exception ):
pass

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.