Python穩基修煉之異常處理

愛喝啤酒的雷神發表於2020-10-22

錯誤與異常

1、區分錯誤與異常

兩種錯誤(都必須改正): 語法錯誤(程式碼不規範,格式不對或缺少符號)、邏輯錯誤(邏輯不通)
  異常: 程式執行時發生錯誤的訊號

2、異常處理與注意事項

異常處理: 程式設計師特意去捕捉異常,如果捕捉成功,就進入另外一段你定義的邏輯裡去執行,使程式不會崩潰

注意: 異常處理的邏輯應該是與程式的主邏輯的分離開的;根本不會有人去用執行到一半就崩潰的軟體,所以我們必須提供一種異常處理機制來增強我們程式的健壯性和容錯性

各種異常

1、常見異常

AttributeError 試圖訪問一個物件沒有的屬性,比如test.a,但是test沒有屬性a
  IOError 輸入/輸出異常;基本上就是無法開啟檔案
  ImportError 無法引入模組或包;基本上就是路徑問題或名稱錯誤
  IndentationError 語法錯誤(的子類) ;程式碼沒有正確縮排或對齊
  IndexError 下標索引超出序列邊界,比如當a只有三個元素,卻試圖訪問a[5]
  KeyError 鍵異常,試圖訪問字典裡不存在的鍵
  KeyboardInterrupt Ctrl+C被按下
  NameError 使用一個還未被賦予物件的變數
  SyntaxError Python程式碼非法,程式碼不能編譯(基本上就是語法錯誤)
  TypeError 傳入物件型別與要求的不符合
  UnboundLocalError 試圖訪問一個還未被設定的區域性變數,基本上是由於另有一個同名的全域性變數,導致你以為正在訪問它
  ValueError 值異常,傳入一個呼叫者不期望的值,即使值的型別是正確的

2、其他異常

ArithmeticError
 AssertionError
 AttributeError
 BaseException
 BufferError
 BytesWarning
 DeprecationWarning
 EnvironmentError
 EOFError
 Exception
 FloatingPointError
 FutureWarning
 GeneratorExit
 ImportError
 ImportWarning
 IndentationError
 IndexError
 IOError
 KeyboardInterrupt
 KeyError
 LookupError
 MemoryError
 NameError
 NotImplementedError
 OSError
 OverflowError
 PendingDeprecationWarning
 ReferenceError
 RuntimeError
 RuntimeWarning
 StandardError
 StopIteration
 SyntaxError
 SyntaxWarning
 SystemError
 SystemExit
 TabError
 TypeError
 UnboundLocalError
 UnicodeDecodeError
 UnicodeEncodeError
 UnicodeError
 UnicodeTranslateError
 UnicodeWarning
 UserWarning
 ValueError
 Warning
 ZeroDivisionError
這些異常都比較少見,所以也沒有必要全部列出來是哪方面的異常,太多了也記不住,所以可以遇到再去搜尋這些少見的異常的解決方案

異常處理

1、if判斷式

while True:     cou = input('請輸入你的賬號:\n')     if cou.isdigit():  #主邏輯,如果全是數字才執行轉換int格式操作         int(cou)         break     #下面幾個就為異常準備的邏輯,在寫程式時就應該考慮到各種可能出現的異常     elif cou.isspace():           print('賬號內不應有空格,請重新輸入')         continue     elif len(cou)==0:         print('您輸入的長度為0,請重新輸入')     elif cou.isalpha():         print('賬號內不應有字母,請重新輸入')     else:         print('輸入內有其他非法輸入,請重新輸入') 123456789101112131415 複製程式碼
執行結果:

![if判斷式](https://img-blog.csdnimg.cn/20200319173421582.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1ZpZXdpbmZpbml0ZWx5,size_16,color_FFFFFF,t_70)

\*\*if判斷式的缺點:\*\* 只能針對某一段程式碼,對於不同的程式碼段的相同錯誤型別需需要寫重複的if來進行處理,顯得非常贅餘,可讀性極其差

2、try … except …異常處理

while True:     try:  #主邏輯         cou = input('請輸入數字:\n')         int(cou)          cou2 = input('請再輸入數字:\n')         int(cou2)      except ValueError as e:         #ValueError是異常型別,表示如果出現值的異常,就執行except下的邏輯         print(e,'請重新輸入')     except KeyError as e:  #如果出現鍵的異常         print(e,'請重新輸入')     except IndexError as e:  #如果出現語法異常         print(e,'請重新輸入')     except Exception as e:  #如果出現其他異常         print(e,'請重新輸入')      else:         print('try內的程式碼沒有異常就執行else')  #沒有異常就會執行else的內容      finally:         print('無論try中有無異常,finally都會執行')         break  #常用來做清理記憶體操作,或者跳出迴圈 123456789101112131415161718192021222324 複製程式碼
執行結果:

![exectp異常處理](https://img-blog.csdnimg.cn/20200319173821599.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1ZpZXdpbmZpbml0ZWx5,size_16,color_FFFFFF,t_70)



3、主動異常

name = 'ViewIn' try:     raise TypeError('型別錯誤')  #用raise主動觸發異常 except Exception as e:     print(e) 12345 複製程式碼
執行結果:

![主動異常](https://img-blog.csdnimg.cn/20200319173928221.png)



4、斷言

print('---------------------------line1') assert 1 == 1 print('===========================line2')  #如果assert的表示式成立,則繼續執行,否則程式終止  #相當於 if 1 != 2:     raise AssertionError  #主動丟擲一個異常  #斷言後面有一萬行程式碼 123456789 複製程式碼
執行結果:

![斷言]( https://img-blog.csdnimg.cn/20200319174008429.png)

結束!


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69984138/viewspace-2728800/,如需轉載,請註明出處,否則將追究法律責任。

相關文章