1. 程式人生 > >Python學習【第15篇】:面向物件之異常處理 python------------------異常處理

Python學習【第15篇】:面向物件之異常處理 python------------------異常處理

python------------------異常處理

一、錯誤與異常

程式中難免會出現錯誤,而錯誤分為兩種

1.語法錯誤:(這種錯誤,根本過不了python直譯器的語法檢測,必須在程式執行前就改正)

2.邏輯錯誤:(邏輯錯誤),比如使用者輸入的不合適等一系列錯誤

那什麼是異常呢?

  異常就是程式執行時發生錯誤的訊號,在python中,錯誤觸發的異常如下。異常發生之後,異常之後的程式碼就不執行了

 異常種類:在python中不同的異常可以用不同的型別(python中統一了類與型別,型別即類)去標識,

不同的類物件標識不同的異常,一個異常標識一種錯誤

常見的異常:

複製程式碼
 1 ArithmeticError
 2 AssertionError
 3 AttributeError
 4 BaseException
 5 BufferError
 6 BytesWarning 7 DeprecationWarning 8 EnvironmentError 9 EOFError 10 Exception 11 FloatingPointError 12 FutureWarning 13 GeneratorExit 14 ImportError 15 ImportWarning 16 IndentationError 17 IndexError 18 IOError 19 KeyboardInterrupt 20 KeyError 21 LookupError 22 MemoryError 23 NameError 24 NotImplementedError 25 OSError 26 OverflowError 27 PendingDeprecationWarning 28 ReferenceError 29 RuntimeError 30 RuntimeWarning 31 StandardError 32 StopIteration 33 SyntaxError 34 SyntaxWarning 35 SystemError 36 SystemExit 37 TabError 38 TypeError 39 UnboundLocalError 40 UnicodeDecodeError 41 UnicodeEncodeError 42 UnicodeError 43 UnicodeTranslateError 44 UnicodeWarning 45 UserWarning 46 ValueError 47 Warning 48 ZeroDivisionError
複製程式碼

二、異常處理

1.什麼是異常處理?      

python直譯器檢測到錯誤,觸發異常(也允許程式設計師自己觸發異常)

程式設計師編寫特定的程式碼,專門用來捕捉這個異常(這段程式碼與程式邏輯無關,與異常處理有關)

如果捕捉成功則進入另外一個處理分支,執行你為其定製的邏輯,使程式不會崩潰,這就是異常處理

2.為何要進行異常處理?

python解析器去執行程式,檢測到了一個錯誤時,觸發異常,異常觸發後且沒被處理的情況下,程式就在當前異常處終止,後面的程式碼不會執行,誰會去用一個執行著突然就崩潰的軟體。

所以你必須提供一種異常處理機制來增強你程式的健壯性與容錯性 

3.如何進行異常處理

首先須知,異常是由程式的錯誤引起的,語法上的錯誤跟異常處理無關,必須在程式執行前就修正

①使用if判斷

複製程式碼
 1 num1=input('>>: ') #輸入一個字串試試
 2 if num1.isdigit():
 3     int(num1) #我們的正統程式放到了這裡,其餘的都屬於異常處理範疇
 4 elif num1.isspace():
 5     print('輸入的是空格,就執行我這裡的邏輯')
 6 elif len(num1) == 0:
 7     print('輸入的是空,就執行我這裡的邏輯')
 8 else: 9 print('其他情情況,執行我這裡的邏輯') 10 11 ''' 12 問題一: 13 使用if的方式我們只為第一段程式碼加上了異常處理,但這些if,跟你的程式碼邏輯並無關係,這樣你的程式碼會因為可讀性差而不容易被看懂 14 15 問題二: 16 這只是我們程式碼中的一個小邏輯,如果類似的邏輯多,那麼每一次都需要判斷這些內容,就會倒置我們的程式碼特別冗長。 17 '''
複製程式碼

總結:

1.if判斷式的異常處理只能針對某一段程式碼,對於不同的程式碼段的相同型別的錯誤你需要寫重複的if來進行處理。

2.在你的程式中頻繁的寫與程式本身無關,與異常處理有關的if,會使得你的程式碼可讀性極其的差

3.if是可以解決異常的,只是存在1,2的問題,所以,千萬不要妄下定論if不能用來異常處理。

②python為每一種異常定製了一個型別,然後提供了一種特定的語法結構用來進行異常處理

1.語法:

?
1 2 3 4 try :       被檢測的程式碼塊 except  異常型別:       try 中一旦檢測到異常,就執行這個位置的邏輯 

2.異常類只能用來處理指定的異常情況,如果非指定異常則無法處理。

?
1 2 3 4 5 s1  =  'hello' try :      int (s1) except  IndexError as e:      print (e)<br> #沒有捕獲到異常,程式直接報錯

3.多分支

複製程式碼
 1 捕獲異常
 2 num= input('num:>>')
 3 try:
 4     f= open ('file','w')
 5     # int(num)
 6     # l = []
 7     # l[10000]
 8     # 1 / 0
 9     # dic = {'k': 'v'}
10     # dic['k2']
11     print('-----------')
12 except ValueError : 13 print('請輸入一個數字') 14 except NameError as name_e: 15 print(name_e) 16 print('=======') 17 except IndentationError as name_e: 18 print(name_e) 19 except IndexError as name_e: 20 print(name_e) 21 except SyntaxError as name_e: 22 print(name_e) 23 except ZeroDivisionError as name_e: 24 print(name_e) 25 except AttributeError as name_e: 26 print(name_e) 27 except KeyError as name_e: 28 print(name_e) 29 # except Exception as e: 30 # print(e,'異常了') 31 else: #如果上面出現問題了,就不執行else,如果都正確了就會執行else裡的內容(支付過程可以用到else) 32 print('else 被執行') 33 finally: #不過這段程式碼出沒出問題,都執行這裡的內容 34  f.close() 35 print('finally')
複製程式碼

4.萬能異常:可以捕獲任意異常

?
1 2 3 4 5 s1  =  'hello' try :      int (s1) except  Exception as e:      print (e)

5.主動觸發異常

1 主動拋異常
2 try:
3     raise AttributeError('錯啦錯啦')
4 except AttributeError as e:
5     print(e)

6.自定義異常

複製程式碼
1 class EgonException(BaseException):
2     def __init__(self,msg):
3         self.msg = msg
4     # def __str__(self):   可以不用寫這個方法,因為那個BaseException父類裡面已經實現了
5     #     return self.msg
6 try:
7     raise EgonException('egon出異常啦')
8 except EgonException as e: 9 print(e)
複製程式碼

7.斷言

1 斷言:一個會丟擲異常的判斷,這個條件一旦成立就成立了,一旦不成立就報錯了,就都不執行下面的了
2 assert 1==2
3 if 1==2:
4     print()
5 print('haha')

try..except的方式比較if的方式的好處

try..except這種異常處理機制就是取代if那種方式,讓你的程式在不犧牲可讀性的前提下增強健壯性和容錯性

異常處理中為每一個異常定製了異常型別(python中統一了類與型別,型別即類),對於同一種異常,一個except就可以捕捉到,可以同時處理多段程式碼的異常(無需‘寫多個if判斷式’)減少了程式碼,增強了可讀性 

 

使用try..except的方式

1:把錯誤處理和真正的工作分開來
2:程式碼更易組織,更清晰,複雜的工作任務更容易實現;
3:毫無疑問,更安全了,不至於由於一些小的疏忽而使程式意外崩潰了;

三、什麼時候用異常處理

try...except應該儘量少用,因為它本身就是你附加給你的程式的一種異常處理的邏輯,與你的主要的工作是沒有關係的

這種東西加的多了,會導致你的程式碼可讀性變差,只有在有些異常無法預知的情況下,才應該加上try...except,

其他的邏輯錯誤應該儘量修正

 

一、錯誤與異常

程式中難免會出現錯誤,而錯誤分為兩種

1.語法錯誤:(這種錯誤,根本過不了python直譯器的語法檢測,必須在程式執行前就改正)

2.邏輯錯誤:(邏輯錯誤),比如使用者輸入的不合適等一系列錯誤

那什麼是異常呢?

  異常就是程式執行時發生錯誤的訊號,在python中,錯誤觸發的異常如下。異常發生之後,異常之後的程式碼就不執行了

 異常種類:在python中不同的異常可以用不同的型別(python中統一了類與型別,型別即類)去標識,

不同的類物件標識不同的異常,一個異常標識一種錯誤

常見的異常:

複製程式碼
 1 ArithmeticError
 2 AssertionError
 3 AttributeError
 4 BaseException
 5 BufferError
 6 BytesWarning 7 DeprecationWarning 8 EnvironmentError 9 EOFError 10 Exception 11 FloatingPointError 12 FutureWarning 13 GeneratorExit 14 ImportError 15 ImportWarning 16 IndentationError 17 IndexError 18 IOError 19 KeyboardInterrupt 20 KeyError 21 LookupError 22 MemoryError 23 NameError 24 NotImplementedError 25 OSError 26 OverflowError 27 PendingDeprecationWarning 28 ReferenceError 29 RuntimeError 30 RuntimeWarning 31 StandardError 32 StopIteration 33 SyntaxError 34 SyntaxWarning 35 SystemError 36 SystemExit 37 TabError 38 TypeError 39 UnboundLocalError 40 UnicodeDecodeError 41 UnicodeEncodeError 42 UnicodeError 43 UnicodeTranslateError 44 UnicodeWarning 45 UserWarning 46 ValueError 47 Warning 48 ZeroDivisionError
複製程式碼

二、異常處理

1.什麼是異常處理?      

python直譯器檢測到錯誤,觸發異常(也允許程式設計師自己觸發異常)

程式設計師編寫特定的程式碼,專門用來捕捉這個異常(這段程式碼與程式邏輯無關,與異常處理有關)

如果捕捉成功則進入另外一個處理分支,執行你為其定製的邏輯,使程式不會崩潰,這就是異常處理

2.為何要進行異常處理?

python解析器去執行程式,檢測到了一個錯誤時,觸發異常,異常觸發後且沒被處理的情況下,程式就在當前異常處終止,後面的程式碼不會執行,誰會去用一個執行著突然就崩潰的軟體。

所以你必須提供一種異常處理機制來增強你程式的健壯性與容錯性 

3.如何進行異常處理

首先須知,異常是由程式的錯誤引起的,語法上的錯誤跟異常處理無關,必須在程式執行前就修正

①使用if判斷

複製程式碼
 1 num1=input('>>: ') #輸入一個字串試試
 2 if num1.isdigit():
 3     int(num1) #我們的正統程式放到了這裡,其餘的都屬於異常處理範疇
 4 elif num1.isspace():
 5     print('輸入的是空格,就執行我這裡的邏輯')
 6 elif len(num1) == 0:
 7     print('輸入的是空,就執行我這裡的邏輯')
 8 else: 9 print('其他情情況,執行我這裡的邏輯') 10 11 ''' 12 問題一: 13 使用if的方式我們只為第一段程式碼加上了異常處理,但這些if,跟你的程式碼邏輯並無關係,這樣你的程式碼會因為可讀性差而不容易被看懂 14 15 問題二: 16 這只是我們程式碼中的一個小邏輯,如果類似的邏輯多,那麼每一次都需要判斷這些內容,就會倒置我們的程式碼特別冗長。 17 '''
複製程式碼

總結:

1.if判斷式的異常處理只能針對某一段程式碼,對於不同的程式碼段的相同型別的錯誤你需要寫重複的if來進行處理。

2.在你的程式中頻繁的寫與程式本身無關,與異常處理有關的if,會使得你的程式碼可讀性極其的差

3.if是可以解決異常的,只是存在1,2的問題,所以,千萬不要妄下定論if不能用來異常處理。

②python為每一種異常定製了一個型別,然後提供了一種特定的語法結構用來進行異常處理

1.語法:

?
1 2 3 4 try :       被檢測的程式碼塊 except  異常型別:       try 中一旦檢測到異常,就執行這個位置的邏輯 

2.異常類只能用來處理指定的異常情況,如果非指定異常則無法處理。

?
1 2 3 4 5 s1  =  'hello' try :      int (s1) except  IndexError as e:      print (e)<br> #沒有捕獲到異常,程式直接報錯

3.多分支

複製程式碼
 1 捕獲異常
 2 num= input('num:>>')
 3 try:
 4     f= open ('file','w')
 5     # int(num)
 6     # l = []
 7     # l[10000]
 8     # 1 / 0
 9     # dic = {'k': 'v'}
10     # dic['k2']
11     print('-----------')
12 except ValueError : 13 print('請輸入一個數字') 14 except NameError as name_e: 15 print(name_e) 16 print('=======') 17 except IndentationError as name_e: 18 print(name_e) 19 except IndexError as name_e: 20 print(name_e) 21 except SyntaxError as name_e: 22 print(name_e) 23 except ZeroDivisionError as name_e: 24 print(name_e) 25 except AttributeError as name_e: 26 print(name_e) 27 except KeyError as name_e: 28 print(name_e) 29 # except Exception as e: 30 # print(e,'異常了') 31 else: #如果上面出現問題了,就不執行else,如果都正確了就會執行else裡的內容(支付過程可以用到else) 32 print('else 被執行') 33 finally: #不過這段程式碼出沒出問題,都執行這裡的內容 34  f.close() 35 print('finally')
複製程式碼

4.萬能異常:可以捕獲任意異常

?
1 2 3 4 5 s1  =  'hello' try :      int (s1) except  Exception as e:      print (e)

5.主動觸發異常

1 主動拋異常
2 try:
3     raise AttributeError('錯啦錯啦')
4 except AttributeError as e:
5     print(e)

6.自定義異常

複製程式碼
1 class EgonException(BaseException):
2     def __init__(self,msg):
3         self.msg = msg
4     # def __str__(self):   可以不用寫這個方法,因為那個BaseException父類裡面已經實現了
5     #     return self.msg
6 try:
7     raise EgonException('egon出異常啦')
8 except EgonException as e: 9 print(e)
複製程式碼

7.斷言

1 斷言:一個會丟擲異常的判斷,這個條件一旦成立就成立了,一旦不成立就報錯了,就都不執行下面的了
2 assert 1==2
3 if 1==2:
4     print()
5 print('haha')

try..except的方式比較if的方式的好處

try..except這種異常處理機制就是取代if那種方式,讓你的程式在不犧牲可讀性的前提下增強健壯性和容錯性

異常處理中為每一個異常定製了異常型別(python中統一了類與型別,型別即類),對於同一種異常,一個except就可以捕捉到,可以同時處理多段程式碼的異常(無需‘寫多個if判斷式’)減少了程式碼,增強了可讀性 

 

使用try..except的方式

1:把錯誤處理和真正的工作分開來
2:程式碼更易組織,更清晰,複雜的工作任務更容易實現;
3:毫無疑問,更安全了,不至於由於一些小的疏忽而使程式意外崩潰了;

三、什麼時候用異常處理

try...except應該儘量少用,因為它本身就是你附加給你的程式的一種異常處理的邏輯,與你的主要的工作是沒有關係的

這種東西加的多了,會導致你的程式碼可讀性變差,只有在有些異常無法預知的情況下,才應該加上try...except,

其他的邏輯錯誤應該儘量修正