1、錯誤與異常python
程序中不免會出現錯誤,而錯誤分爲兩種git
1.語法錯誤:(這種錯誤,根本過不了python解釋器的語法檢測,必須在程序執行前就改正)程序員
2.邏輯錯誤:(邏輯錯誤),好比用戶輸入的不合適等一系列錯誤安全
那什麼是異常呢?spa
異常就是程序運行時發生錯誤的信號,在python中,錯誤觸發的異常以下。異常發生以後,異常以後的代碼就不執行了code
異常種類:在python中不一樣的異常能夠用不一樣的類型(python中統一了類與類型,類型即類)去標識,對象
不一樣的類對象標識不一樣的異常,一個異常標識一種錯誤blog
常見的異常:ci
2、異常處理字符串
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.多分支
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.主動觸發異常
主動拋異常 2 try: 3 raise AttributeError('錯啦錯啦') 4 except AttributeError as e: 5 print(e)
6.自定義異常
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.斷言
斷言:一個會拋出異常的判斷,這個條件一旦成立就成立了,一旦不成立就報錯了,就都不執行下面的了 2 assert 1==2 3 if 1==2: 4 print() 5 print('haha')
try..except這種異常處理機制就是取代if那種方式,讓你的程序在不犧牲可讀性的前提下加強健壯性和容錯性
異常處理中爲每個異常定製了異常類型(python中統一了類與類型,類型即類),對於同一種異常,一個except就能夠捕捉到,能夠同時處理多段代碼的異常(無需‘寫多個if判斷式’)減小了代碼,加強了可讀性
使用try..except的方式
1:把錯誤處理和真正的工做分開來
2:代碼更易組織,更清晰,複雜的工做任務更容易實現;
3:毫無疑問,更安全了,不至於因爲一些小的疏忽而使程序意外崩潰了;
3、何時用異常處理
try...except應該儘可能少用,由於它自己就是你附加給你的程序的一種異常處理的邏輯,與你的主要的工做是沒有關係的
這種東西加的多了,會致使你的代碼可讀性變差,只有在有些異常沒法預知的狀況下,才應該加上try...except,
其餘的邏輯錯誤應該儘可能修正