try except (異常捕獲)


try except (異常捕獲)

當程序出錯了,但是我們又不想讓用戶看到這個錯誤,而且我在寫程序的時候已經預料到了它可以出現這樣的錯誤,出現這樣的錯誤代表着什么,我們可以提前捕獲這些個錯誤

 

1、異常處理流程圖:

 

2、常見異常

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 傳入一個調用者不期望的值,即使值的類型是正確的

 更多異常:

 

 

 

 

3、處理單個異常

語法如下:

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

4、處理多個異常

①寫多個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'

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

5、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'

6、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
沒有異常

7、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語句

  

 8、自定義異常

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

觸發自定義異常:

1
2
3
4
5
6
7
try :
     raise  GaoError( "數據庫連接不上了" )   #觸發自定義異常,GaoError("數據庫連接不上了")這個對象
except  GaoError as e:
     print (e)
  
#輸出
數據庫連接不上了

 自定義使用總結:

  1. 數據庫連接不上的信息
  2. 權限問題,解析是沒有權限了,給出異常提示
  3. 業務邏輯的錯誤

 

 

斷言

斷言被用作你接下來的程序執行,如果后面程序依賴於前面的程序,后面的程序有很重要,就是后面的程序執行肯定不能出錯,所以在執行之前要做檢查工作。

1、斷言assert

1
2
3
4
5
6
7
8
9
10
11
12
13
class  C( object ):
  
     def  __init__( self ):
         self .name  =  "AAAAA"
  
c_obj  =  C()
  
assert  c_obj.name   = =  "AAAAA"    #斷言
  
print ( "沒有錯誤繼續..." )
  
#輸出
沒有錯誤繼續..

2、斷言不符合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class  C( object ):
  
     def  __init__( self ):
         self .name  =  "AAAAA"
  
c_obj  =  C()
  
assert  c_obj.name   = =  "BBBBB"    #斷言出字符串不匹配
  
print ( "沒有錯誤繼續..." )
  
  
#輸出
Traceback (most recent call last):
   File  "E:/PycharmProjects/pytest/day7/斷言.py" , line  10 in  <module>
     assert  c_obj.name   = =  "BBBBB
AssertionError    #報斷言異常錯誤

3、其實也可以使用if解決這個問題,不過相比之下斷言assert更優雅一些,減少代碼量

1
2
3
4
5
6
7
8
9
10
11
class  C( object ):
  
     def  __init__( self ):
         self .name  =  "zhangqigao"
  
c_obj  =  C()
  
if  c_obj.name   = =  "gaogao" :
     print ( "有錯誤...." )
else :
     print ( "沒有錯誤繼續..." )


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM