Python基础教程【读书笔记】 - 2016/7/5
希望通過博客園持續的更新,分享和記錄Python基礎知識到高級應用的點點滴滴!
第三波:第8章 ?異常
[總覽]學習如何創建和引發自定義的異常,以及處理異常的各種方法。
為了能夠處理異常事件,可以再所有可能發生這類事件的地方都使用條件語句,但是這么做可能不僅會沒效率和不靈活,而且還會讓程序難以閱讀。Python的異常對象提供了非常強大的替代解決方案。
[8.1] 什么是異常
Python用異常對象(exception object)來表示異常情況。遇到錯誤后,會引發異常。如果異常對象并未被處理或捕捉,程序就會用所謂的回溯(Traceback,一種錯誤信息)終止執行。
事實上,每個異常都是一些類的實例,這些實例可以被引發,并且可以用多種方法進行捕捉,使得程序可以捉住錯誤并且對其進行處理,而不是讓整個程序失敗。
[8.2] 按自己的方式出錯
異??梢栽谀承〇|西出錯時自動引發。先學習如何引發異常---甚至創建自己的異常類型。
[8.2.1] raise語句
為了引發異常,可以使用一個類(應該是Exception的子類)或者實例參數調用raise語句。使用類時沒程序會自動創建實例。如下使用內建的Exception異常類:
raise Exception
raise Exception('Hyperdrive overload')
第一個例子raise Exception引發一個沒有任何有關錯誤信息的普通異常,后一個例子中,則添加了一些hyperdive overload錯誤信息。
內建的異常類有很多,內建異常都可以再exception模塊中找到。使用dir函數列出模塊的內容:
import exception
dir(exception)
所有這些異常都可以用在raise語句中:
raise ArithmeticError
表8-1 一些內建異常
類名 描述
Exception 所有異常的基類
AttributeError ?特性引用或賦值失敗時引發
IOError 試圖打開不存在文件時引發
IndexError 在使用序列中不存在的索引時引發
KeyError 在使用映射中不存在的鍵時引發
NameError 在找不到名字(變量)時引發
SyntaxError ?在代碼為錯誤形式時引發
TypeError ?在內建操作或者函數應用于錯誤類型的對象時引發
ValueError 在內建操作或者函數應用于正確類型的對象,但該對象使用不合適的值時引發?
ZeroDivisionError 在除法或者模除操作的第二個參數為0時引發
[8.2.2] 自定義異常類
有些時候創建自己的異常類。那么如何創建自己的異常類呢?只是要確保從Exception類繼承(不管是間接的或者是直接的,也就是說繼承其他的內建異常類也是可以的),編寫一個自定義異常類基本上如下:
class SomeCustomException(Exception):pass
[8.3] 捕捉異常
關于異常最有意思的地方就是可以處理它們(通常叫做誘捕或者捕捉異常),可以使用try/except來實現。
為了捕捉異常并且做出一些錯誤處理,如下:
try:
x=input('Enter the first number:')
y=input('Enter the second number:')
print x/y
except ZeroDivisionError:
print "The second number can't be zero!"
看起來用if語句檢查y值會更簡單一些,但是如果需要給程序加入更多除法,那么就得給每個除法加個if語句。而使用try/except的話只需要一個錯誤處理器。
如果捕捉到了有慈航,但是又想重新引發它(也就是說要傳遞異常),那么可以調用不帶參數的raise。
class MuffledCalculator:
muffled=False
def calc(self,expr):
try:
return eval(expr)
except ZeroDivisionError:
if self.muffled:
print 'Division by zero is illegal'
else:
raise
[8.4] 不止一個except子句
可以再同一個try/except語句后面加上另一個except子句?!?/p>
try:
x=input('Enter the first number:')
y=input('Enter the second number:')
print x/y
except ZeroDivisionError:
print "The second number can't be zero!"
except TypeError:
print "That wan't a number ,was it?"
應該注意到,異常處理并不會將搞亂原來的代碼,而增加一大堆if語句檢查可能的錯誤情況會讓代碼相當難度。
[8.5]?用一個塊捕捉兩個異常
? 如果需要用一個塊捕捉多個類型異常,那么可以將它們作為元組列出,像下面這樣:
try:
x=input('Enter the first number:')
y=input('Enter the second number:')
print x/y
except (ZeroDivisionError,TypeError,NameError):
print 'Your number were bogus...'
注意except子句中異常對象外面的圓括號很重要。忽略它們是一種常見的錯誤。
[8.6] 捕捉對象
如果希望在except子句訪問異常對象本身,可以使用兩個參數。注意,就算捕捉到多個異常,也只需向except子句提供一個參數。如果想讓程序繼續運行,但是又因為某種原因想記錄下錯誤,這個功能就很有用。
try:
x=input('Enter the first number:')
y=input('Enter the second number:')
print x/y
except (ZeroDivisionError,TypeError),e:
print e
[8.7] 真正的全捕捉
如果真的想用一段代碼捕捉所有異常,那么可以在except子句中忽略所有的異常類:
try:
......
except:
print 'Something wrong happened...'
這樣捕捉所有異常時危險的,因為它會隱藏所有程序員未想到并未做好準備處理的錯誤。
[8.8] 萬事大吉
可以像對條件和循環語句那樣,給try/except語句價格else子句:
try:
print 'A simple task'
except:
print 'What? Something went wrong!'
else:
print 'Ah...It went as planned!'
[8.9] 最后......
最后是finally子句,它可以用來在可能的異常后進行清理,它和try子句聯合使用:
x=None
try:
x=1/0
finally:
print 'Cleaning up...'
del x
上面的代碼中,finally子句肯定會被執行,不管try子句中是否發生異常。因為使用del語句刪除一個變量是非常不負責的清理手段,所以finally子句用于關閉文件或者網絡套接字時會非常有用。還可以在同一條語句中組合使用try、except、finally和else。
try:
1/0
except NameError:
print 'Unknown variable'
else:
print "That went well!"
finally:
print "Cleaning up....."
[8.10] 異常和函數
異常和函數能很自然地一起工作。如果異常在函數內引發而不被處理,它就會傳播至函數調用的地方。如果在那里也沒有處理異常,它就會繼續傳播,一直到達主程序(全局作用域)。如果那里沒有異常處理程序,程序會帶著堆棧跟蹤中止。
[8.11] 異常之禪
異常處理并不是很復雜。如果知道某段代碼可能會導致某種異常,而又不希望程序以堆棧跟蹤的形式終止,那么久根據需要添加try/except或者try/finally語句進行處理。
[8.12] 小結
異常對象:異常情況可以用異常對象表示。
警告:警告類似于異常,但是一般來說僅僅打印錯誤信息。
引發異常:可以使用raise語句引發異常。它接受異常類或者異常實例作為參數,還能提供兩個參數(異常和錯誤信息)。
自定義異常類:用繼承Exception類的方法可以創建自己的異常類。
捕捉異常:使用try語句的except子句捕捉異常。異??梢苑旁谠M中以實現多個異常的制定。如果給except提供兩個參數,第2個參數就會綁定到異常對象上。同樣,在一個try/except語句中能包含多個except子句,用來分別處理不同的異常。
else子句:如果主try塊中沒有引發異常,else子句就會被執行。
finally:如果需要確保某些代碼不管是否有異常引發都要執行,那么這些代碼可以防止在finally子句中。
異常和函數:在函數內引發異常時,它就會被傳播到函數調用的地方。
?
轉載于:https://www.cnblogs.com/pythonMLer/p/5642161.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Python基础教程【读书笔记】 - 2016/7/5的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 切换debian8系统语言环境
- 下一篇: Python Model : glob