Python 之異常處理
阿新 • • 發佈:2019-02-20
導致 輸出 信號 pan base board put info 基本語法
一 錯誤和異常
?錯誤分兩種:
1、語法錯誤
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # 舉列 4 print(‘hello world‘ # 少) 5 6 def test: # 少() 7 print(‘hello world‘)語法錯誤舉列
2、邏輯錯誤
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 # 舉列 5 print(1/0) # 邏輯錯誤,被除數不能為0 6 7 l = [1, 2] 8 print(l[10]) # 超出索引範圍;從0開始計數邏輯錯誤舉列9 10 11 age = input(‘請輸入你的年齡:‘) 12 age = int(age) # 若用戶輸入字符串,報邏輯錯誤,字符串無法轉int
?什麽是異常
異常就是程序運行時發生錯誤的信號,在Python中,錯誤出發的異常如下
?Python中的異常種類
在Python中不同的異常可以用不同的類型(Python中統一了類與類型,類型即使類)去標識,不同的類對象標識不同的異常,一個異常標識一種錯誤。
1 AttributeError:試圖訪問一個對象沒有的屬性,比如foo.y,但是foo沒有屬性y 2 IOError:輸入/輸出異常;基本上是無法打開文件3 ImportError:無法引入模塊或包;基本上是路徑問題或名稱錯誤 4 IndentationError:語法錯誤(的子類);代碼沒有正確對齊 5 IndexError:下標索引超出序列邊界 6 KeyError:試圖訪問字典裏不存在的鍵 7 KeyBoardInterrupt:ctrl+c被按下(在cmd命令下) 8 NameError:使用一個還未被賦予對象的變量 9 SyntaxError:Python代碼非法。代碼不能編譯 10 TypeError:傳入對象類型與要求的不符合 11 UnboundLocalError:試圖訪問一個還未被設置的局部變量,基本上是由於另有一個同名的全局變量,才導致你以為正在訪問它12 ValueError:傳入一個調用者不期望的值,即使值的類型是正確的
二 異常處理
2.1 什麽是異常處理?
Python解釋器檢測到錯誤,觸發異常(也允許程序員自己觸發異常),程序員編寫特定的代碼,專門用來捕捉這個異常(這段代碼與程序邏輯無關,與異常處理有關),如果捕捉成功則進入另外一個處理分支,執行你為其定制的邏輯,使程序不會崩潰,這就是異常處理。
2.2 為何要進行異常處理?
Python解釋器去執行程序,檢測到了一個錯誤時,觸發異常,異常觸發後且沒被處理的情況下,程序就在當前異常處終止,後面的代碼不會運行,誰會去用一個運行著就突然崩潰的軟件。所以你必須提供一種異常處理機制來增強你程序的健壯性與容錯性。
2.3 如何進行異常處理?
首先,異常是由程序的錯誤引起的,語法上的錯誤跟異常處理無關,必須在程序運行前就修正。
一:使用if判斷
二:Python為每一種異常定制了一個類型,然後提供了一種特定的語法結構用來進行異常處理
part1:基本語法
1 try: 2 被檢測的代碼塊 3 except 異常類型: 4 try中一旦檢測異常,就執行except中的代碼塊
part2:異常類只能用來處理指定的異常情況,如果非指定異常則無法處理。
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 try: 4 age = ‘alex‘ 5 int(age) 6 except IndexError as e: # Exception as e 7 print(e) 8 9 ‘‘‘ 10 打印結果如下: 11 D:\Python\insert3\python3.exe H:/pythons3_/2019-02-20/錯誤與異常.py 12 Traceback (most recent call last): 13 File "H:/pythons3_/2019-02-20/錯誤與異常.py", line 5, in <module> 14 int(age) 15 ValueError: invalid literal for int() with base 10: ‘alex‘ 16 ‘‘‘
part3:異常的其他結構(包括多分支Except)
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 try: 4 age = 15 5 int(age) 6 except ValueError as e: 7 print(e) 8 except IndexError as e: 9 print(e) 10 except Exception as e: 11 print(e) 12 else: 13 print(‘try內代碼塊沒有異常則執行我‘) 14 finally: 15 print(‘無論異常與否,都會執行該模塊,通常是進行清理工作‘) 16 17 ‘‘‘ 18 打印結果如下: 19 D:\Python\insert3\python3.exe H:/pythons3_/2019-02-20/錯誤與異常.py 20 try內代碼塊沒有異常則執行我 21 無論異常與否,都會執行該模塊,通常是進行清理工作 22 ‘‘‘
part4:主動觸發異常
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 name = ‘alex‘ 4 try: 5 raise TypeError(‘類型錯誤‘) 6 except Exception as e: 7 print(e)
part5:斷言
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # assert 條件 4 assert 1 == 2 # 不報錯 5 assert 2 == 2 # 報錯;<==> if 2==2: raise AssertionError
Python 之異常處理