1. 程式人生 > >Python 之異常處理

Python 之異常處理

導致 輸出 信號 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 之異常處理