【python學習-6】異常處理

來源:互聯網
上載者:User

標籤:今天   測試   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】異常處理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.