【python學習-6】異常處理
阿新 • • 發佈:2018-08-17
value cat 寫博客 目的 種類 n) 這樣的 自己 true
最近在網上看到了一種學習方法名叫費曼學習法,說的是學習一個東西的時候,要嘗試著給別人講出來,就是一種備課式的學習。
第一步,選擇一個你想要理解的概念, 然後拿出一張白紙, 把這個概念寫在白紙的最上邊。 第二步,設想一種場景,你正要向別人傳授這個概念在白紙上寫下你對這個概念的解釋, 就好像你正在教導一位新接觸這個概念的學生一樣。當你這樣做的時候, 你會更清楚地意識到關於這個概念你理解了多少, 以及是否還存在理解不清的地方。 第三步,如果你感覺卡殼了, 就回顧一下學習資料,無論何時你感覺不清楚了, 都要回到原始的學習資料並重新學習讓你感到不清楚的那部分,直到你領會得足夠順暢, 順暢到可以在紙上解釋這個部分為止。 第四步,為了讓你的講解通俗易懂,簡化語言表達最終的目的, 是用你自己的語言, 而不是學習資料、課程中的語言來解釋概念。如果你的解釋很冗長或者令人迷惑, 那就說明你對概念的理解可能並沒有你自己想象得那麽順暢,你要努力簡化語言表達, 或者與已有的知識建立一種類比關系, 以便更好地理解它。
我覺得費曼學習法很不錯,可以運用到日常的學習中。從這個意義上來說,寫博客就顯得是一件很明智的事情了,因為你就是把你所理解的東西再講出來。
閑話就到這裏,開始今天的學習吧。
1、異常的處理:
python的異常處理和 java 相似性很高,下面是常有的異常處理代碼格式:
try:
<語句>
except <異常1>:
<語句>
except <異常2>:
<語句>
else:
<語句>
try:
<語句>
finally:
<語句>
對於catch語句,有多種寫法:
except: #捕獲所有異常 except <異常名>: #捕獲單個異常 except (異常名1,異常名2): #捕獲多個異常 except <異常名> as <數據>: #捕獲指定異常及附加信息 except (異常名1,異常名2) as <數據>: #捕獲多個異常及附加信息
代碼示例如下:
#!/usr/bin/python
l = [1,2,3,4,5]; print(‘---start---‘); try: print(l[6]); except: # except 為 try的代碼 發生異常時執行。except 是一個總類,所有異常都可以捕獲 print(‘error‘); else: # else 為 try的代碼 沒有引發異常時執行 print(‘no error‘); finally: # finally 為不管 try的代碼 是否異常都執行 print(‘finally code‘); print(‘---end---‘); # 其他語句
#!/usr/bin/python l = [1,2,3,4,5]; print(‘---start---‘); try: print(l[6]); finally: # finally 為不管 try的代碼 是否異常都執行 print(‘finally code‘); # 發生異常,但是此語句是執行了的 print(‘---end---‘); # 其他語句,沒有執行
#!/usr/bin/python # 不同類型的異常區分處理 l = [1,2,3,4,5]; print(‘---start---‘); try: print(l[6]); except ZeroDivisionError: print(‘ZeroDivisionError‘); except IndexError as data: print(‘IndexError:‘); print(data); # 打印異常信息 else: # else 為 try的代碼 沒有引發異常時執行 print(‘no error‘); finally: # finally 為不管 try的代碼 是否異常都執行 print(‘finally code‘); print(‘---end---‘); # 其他語句
上面的第二個代碼,看到了兩個異常 ZeroDivisionError 和 IndexError ,那麽常見的異常有哪些呢?
AttributeError 調用不存在的方法引發的異常 EOFError 遇到文件末尾引發的異常 ImportError 導入模板出錯引起的異常 IndexError 列表越界異常 IOError I/O操作引起的異常 KeyError 使用字典中不存在的變量名應發的異常 NameError 使用不存在的變量名引發的異常 TabError 語句縮進不正確異常 ValueError 搜索列表中不存在的值引發異常 ZeroDivisionError 除數為0引發的異常
在python中,如果多種異常的處理是一樣的,那麽可以把兩個異常寫在一塊兒:
#!/usr/bin/python # 不同類型的異常區分處理 l = [1,2,3,4,5]; print(‘---start---‘); try: print(l[6]); except ZeroDivisionError: print(‘ZeroDivisionError‘); except (IndexError,TabError): # 兩個異常同樣的處理 print(‘IndexError or TabError‘); else: # else 為 try的代碼 沒有引發異常時執行 print(‘no error‘); finally: # finally 為不管 try的代碼 是否異常都執行 print(‘finally code‘); print(‘---end---‘); # 其他語句
2、用代碼拋出異常
上面所說的是Python內置異常,在腳本中,還可以使用 raise 語句手動引發異常。在類中也可以使用 raise 引發異常,並向異常傳遞數據。
raise 異常名
raise 異常名,附加數據
raise 類名
簡單使用一下raise:
#!/usr/bin/python print(‘---start---‘); try: raise Exception except Exception: print(‘Exception‘); else: print(‘no error‘); print(‘---end---‘); # 其他語句
實際應用中應該是這樣的:
#!/usr/bin/python def add(x,y): if x == 0 or y == 0: raise ZeroDivisionError(‘x or y is 0‘); return x+y; try: print(‘run 1‘); a = add(1,2); print(a); print(‘run 2‘); b = add(1,0); print(b); # 這裏沒有打印,因為上一行異常了 except ZeroDivisionError as data: print(data);
assert語句的使用:assert語句同樣可以引發異常,但與raise不同,assert語句在條件測試為假時,才引發異常。
assert <條件測試>,<異常附加信息>
assert的例子:
#!/usr/bin/python
import traceback def add(x,y): assert x != 0 and y != 0 , ‘x or y is 0‘; return x+y; try: print(‘run 1‘); a = add(1,2); print(a); print(‘run 2‘); b = add(1,0); print(b); except: # traceback.print_exc() # 使用python中的traceback模塊,跟蹤錯誤 f=open("D:/tmp/pyError.log",‘a+‘) traceback.print_exc(file=f) # 將報錯輸入到文件中 f.flush()
assert 相當於 raise 語句 和 if 語句聯合使用,但是assert語句一般用於開發自測。只有__debug__為true是,assert 才有效。
3、自定義異常類
python中可以通過繼承Exception類來創建自己的異常類:
#!/usr/bin/python class MyError(Exception): def __init__(self,data): self.data = data; def __str__(self): return "MyError:"+self.data; try: raise MyError(‘0.0‘); except Exception as e: print(e);
【python學習-6】異常處理