標籤:今天 測試 pre ioerror 程式碼範例 語言 通過 縮排 開始
最近在網上看到了一種學習方法名叫費曼學習法,說的是學習一個東西的時候,要嘗試著給別人講出來,就是一種備課式的學習。
第一步,選擇一個你想要理解的概念, 然後拿出一張白紙, 把這個概念寫在白紙的最上邊。第二步,設想一種情境,你正要向別人傳授這個概念在白紙上寫下你對這個概念的解釋, 就好像你正在教導一位新接觸這個概念的學生一樣。當你這樣做的時候, 你會更清楚地意識到關於這個概念你理解了多少, 以及是否還存在理解不清的地方。第三步,如果你感覺卡殼了, 就回顧一下學習資料,無論何時你感覺不清楚了, 都要回到原始的學習資料並重新學習讓你感到不清楚的那部分,直到你領會得足夠順暢, 順暢到可以在紙上解釋這個部分為止。第四步,為了讓你的講解通俗易懂,簡化語言表達最終的目的, 是用你自己的語言, 而不是學習資料、課程中的語言來解釋概念。如果你的解釋很冗長或者令人迷惑, 那就說明你對概念的理解可能並沒有你自己想象得那麼順暢,你要努力簡化語言表達, 或者與已有的知識建立一種類比關係, 以便更好地理解它。
我覺得費曼學習法很不錯,可以運用到日常的學習中。從這個意義上來說,寫部落格就顯得是一件很明智的事情了,因為你就是把你所理解的東西再講出來。
閑話就到這裡,開始今天的學習吧。
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/pythonl = [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/pythonprint(‘---start---‘);try: raise Exceptionexcept Exception: print(‘Exception‘);else: print(‘no error‘);print(‘---end---‘); # 其他語句
實際應用中應該是這樣的:
#!/usr/bin/pythondef 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 tracebackdef 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/pythonclass 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】異常處理