【循序漸進學Python】9.異常處理


1. 拋出異常和自定義異常

Python用異常對象(exception object)表示異常情況,遇到錯誤后,會引發異常。如果異常對象並未被處理或捕捉,程序就會用所謂的回溯(Traceback,一種錯誤信息)終止執行。

 

1.1 raise 語句

Python中的raise 關鍵字用於引發一個異常,基本上和C#和Java中的throw關鍵字相同,如下所示:

1 # -- coding: utf-8 --
2 
3 def ThorwErr():
4     raise Exception("拋出一個異常")
5 
6 # Exception: 拋出一個異常
7 ThorwErr()

 

raise關鍵字后面是拋出是一個通用的異常類型(Exception),一般來說拋出的異常越詳細越好,Python在exceptions模塊內建了很多的異常類型,通過使用dir函數來查看exceptions中的異常類型,如下:

import exceptions

# ['ArithmeticError', 'AssertionError'.....]
print dir(exceptions)

 

傳遞異常

捕捉到了異常,但是又想重新引發它(傳遞異常),可以使用不帶參數的raise語句即可:

 1 # -- coding: utf-8 --
 2 class MuffledCalculator:
 3     muffled = False
 4     def calc(self,expr):
 5         try:
 6             return eval(expr)
 7         except ZeroDivisionError:
 8             if self.muffled:
 9                 print 'Division by zero is illegal'
10             else:
11                 raise

 

1.2 自定義異常類型

Python中也可以自定義自己的特殊類型的異常,只需要要從Exception類繼承(直接或間接)即可:

class SomeCustomException(Exception):
    pass

 

2. 捕捉異常

和C#中的try/catch類似,Python中使用try/except關鍵字來捕捉異常,如下:

# -- coding: utf-8 --

try:
    print 2/0
except ZeroDivisionError:
    print '除數不能為0'

 

2.1 捕捉多個異常

在一個except語句只捕捉其后聲明的異常類型,如果可能會拋出的是其他類型的異常就需要再增加一個except語句了,或者也可以指定一個更通用的異常類型比如:Exception,如下:

# -- coding: utf-8 --
try:
    print 2/'0'
except ZeroDivisionError:
    print '除數不能為0'
except Exception:
    print '其他類型異常'

 

為了捕獲多個異常,除了聲明多個except語句之外,還可以在一個except語句之后將多個異常作為元組列出來即可:

# -- coding: utf-8 --
try:
    print 2/'0'
except (ZeroDivisionError,Exception):
    print '發生了一個異常'

 

2.2獲取異常信息

每個異常都會有一些異常信息,一般情況下我們應該把這些異常信息記錄下來:

# -- coding: utf-8 --
try:
    print 2/'0'
except (ZeroDivisionError,Exception) as e:
    # unsupported operand type(s) for /: 'int' and 'str'
    print e 

 

3. finally子句

finally子句和try子句聯合使用但是和except語句不同,finally不管try子句內部是否有異常發生,都會執行finally子句內的代碼。所有一般情況下,finally自己常常用於關閉文件或者在Socket中。

# -- coding: utf-8 --
try:
    print 2/'0'
except (ZeroDivisionError,Exception):
    print '發生了一個異常'
finally:
    print '不管是否發生異常都執行'

 

參考&進一步閱讀

exceptions模塊

Python基礎教程(第二版)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM