1. 程式人生 > >面向物件【day08】:異常處理(六)

面向物件【day08】:異常處理(六)

本節內容

1、概述

2、異常梳理

3、異常梳理流程圖

4、異常大全

5、自定義異常

一、概述

  異常處理是當程式出錯了,但是我們又不想讓使用者看到這個錯誤,而且我在寫程式的時候已經預料到了它可以出現這樣的錯誤,出現這樣的錯誤代表著什麼,我們可以提前處理這些個錯誤

二、異常處理

2.1 處理單個異常

語法如下:

1 2 3 4 try
:      code    #處理的語句 except   Error1 as e:    #遇到Error1執行下面的語句,在python2中寫成except  Error1,e      print
(e)

程式碼如下:

1 2 3 4 5 6 7 8 name 
=  [ 1 , 2 , 3 ] try :      name[ 3 ]   #不存在3這個下標值 except  IndexError as e:    #抓取 IndexError 這個異常      print (e)  #e是錯誤的詳細資訊   #輸出 list  index out of  range

2.2 處理多個異常

①寫多個except,語法如下:

1 2 3 4 5 6 try :      code except  Error1 as e:   #處理Error1異常      print (e) except  Error2 as e:    #處理Error2異常      print (e)

程式碼如下:

1 2 3 4 5 6 7 8 9 10 11 12 name  =  [ 1 , 2 , 3 ] data  =  { "a" : "b" } try :      data[ "c" ]    #這邊已經出現異常KeyError ,所以直接跳出code,跳到KeyError 下去處理      name[ 3 ] except  IndexError as e:      print (e) except  KeyError as e:      print (e)   #輸出 'c'

②寫1個except,語法如下:

1 2 3 4 try :      code except  (Error1,Error2,...) as e:      print (e)

程式碼如下:

1 2 3 4 5 6 7 8 try :      data[ "c" ]      name[ 3 ] except  (IndexError,KeyError) as e:      print (e)   #輸出 'c'

注:第二種寫法的用處:括號裡面的所有錯誤,不管出現裡面任何一種錯誤都用統一的處理方法。

2.3 Exception異常

語法如下:

1 2 3 4 5 6 try :      code except  (Error1,Error2,...) as e:      print (e) except  Exception as e:    #用Exception表示一下子抓住所有異常,這個一般情況下建議在異常最後面用,用在最後抓未知的異常      print (e)

程式碼如下:

1 2 3 4 5 6 7 8 9 try :      open ( "qigao.text" , "r" ,encoding = "utf-8" ) except  (IndexError,KeyError) as e:    #沒有IndexError,KeyError這兩個異常      print (e) except  Exception as e:   #只能通過這個異常處理,Exception 抓住所有的異常      print (e)   #輸出 [Errno  2 ] No such  file  or  directory:  'qigao.text'

2.4 else作用

作用:沒有異常,則走else部分的邏輯程式碼

1 2 3 4 5 6 7 8 9 10 11 12 try :      print ( "qigao,handson" )     #程式碼沒有異常 except  (IndexError,KeyError) as e:      print (e) except  Exception as e:      print (e) else :              #沒有異常出錯,走else的邏輯程式碼      print ( "沒有異常" )   #輸出 qigao,handson 沒有異常

2.4 finnally作用

作用:不管有沒有錯誤,都會執行finnally中的程式碼

語法如下:

1 2 3 4 5 6 7 8 9 10 try :      code except  (Error1,Error2,...) as e:      print (e) except  Exception as e:      print (e) else :      print ( "沒有錯誤,執行" ) finnally:      print ( "不管有沒有錯,都執行finnally" )

①沒有異常情況

1 2 3 4 5 6 7 8 9 10 11 12 13 14 try :      print ( "qigao,handson" )   #沒有異常 except  (IndexError,KeyError) as e:      print (e) except  Exception as e:      print (e) else :      print ( "沒有異常" ) finally :      print ( "不管有沒有錯,都這行finnally" ) #輸出 qigao,handson 沒有異常 不管有沒有錯,都這行finnally   #沒有報錯,執行finnally

②出現異常情況

1 2 3 4 5 6 7 8 9 10 11 12 13 14 try :      data  =  { "a" : "b" }      data[ "c" ]    #data字典中沒有'c'這個key值 except  (IndexError,KeyError) as e:      print (e) except  Exception as e:      print (e) else :      print ( "沒有異常" ) finally :      print ( "不管有沒有錯,都這行finnally" ) #輸出 'c' 不管有沒有錯,都這行finnally    #出錯了也執行了finnally語句

三、異常處理流程圖

四、異常大全

4.1 常用異常

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

4.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

  

4.3 ValueError

1 2 3 4 5 s1  =  'hello' try :      int (s1) except  ValueError, e:   #python2.7的寫法      print  e

五、自定義異常

5.1 自定義異常

1 2 3 4 5 6 7 class  GaoError(Exception):   #定義一個異常類,繼承Exception        def  __init__( self ,message):          self .message  =  message        def  __str__( self ):          return  self .message  #給物件取一個名字

5.2 觸發自定義異常

1 2 3 4 5 6 7 try :      raise  GaoError( "資料庫連線不上了" )   #觸發自定義異常,GaoError("資料庫連線不上了")這個物件 except  GaoError as e:      print (e)   #輸出 資料庫連線不上了

 自定義使用總結:

  1. 資料庫連線不上的資訊
  2. 許可權問題,解析是沒有許可權了,給出異常提示
  3. 業務邏輯的錯誤