從零開始的Python計劃9.2--異常

異常

異常:程序運行時發生的錯誤。
–----通常會導致程序突然停止

追溯:是一條錯誤消息,它提供導致異常的行號信息。(可以看出是哪條代碼造成了錯誤)
-----指示異常的類型以及導致引發異常的錯誤的簡要描述

舉例:

def read_number():
       num = int("eleven")#這會引起一個異常,因爲eleven是一個字符串,不能用整數int
   read_number()


就會得到以下錯誤:
Traceback (most recent call last):
     File "C:\......\Lecture_5.py", line 3, in <module>
       read_number()
     File "C:\......\Lecture_5.py", line 2, in read_number
       num = int("eleven")
   ValueError: invalid literal for int() with base 10: 'eleven'

避免異常

通過仔細編碼可以防止許多異常。
----示例:輸入驗證(當我們有輸入時,在輸入系統之前,可以檢查輸入是否符合我們的要求)
通常需要一個簡單的決策結構:(舉例)

 if N > 0:
        math.sqrt(N)
 如果傳遞的值爲0或者更低,就會給出一個錯誤。
 通過這樣事先寫一個if語句可以確保我們的N是一個理想的值。

一些異常無法通過仔細的編碼來避免。
-----比如試圖將非數字字符串轉換爲整數,
-----試圖打開一個讀取不存在的文件。

異常處理

異常處理程序:在引發異常並防止程序崩潰時響應的代碼。
在Python中,使用try/except語法來捕捉錯誤。

格式:
try:
statements
except exceptionName:
statements

嘗試套件:可能引發異常的語句
處理程序或例外部分:except塊中包含的語句

舉例:
在這裏插入圖片描述
有一個函數,它把num1除以num2
但是不能把12除以0,任何數字都不能除以零。
在這裏插入圖片描述
我們知道用戶可以輸入0
我們可以編寫另一個類似的函數:
在這裏插入圖片描述
取兩個數字把它們相除,不一樣的是:
不是僅僅像之前分開,而是用try語句把數字相除,
如果得到零語法錯誤 (ZeroDivisionError是確切的錯誤名稱),就會打印異常。因此,這樣操作後,代碼的結果會是一個恰當的結果。
在這裏插入圖片描述

處理多個異常

嘗試套件中的代碼通常可以引發不止一種類型的異常。需要爲每種需要處理的異常類型編寫except子句。所以正確的做法是儘量具體化。
在這裏插入圖片描述
有一個除數函數,從輸入中取兩個數,然後打印數字除以數字的結果。

假設我們輸入的數字是這樣的:
在這裏插入圖片描述
我們就會有ValueError

在這裏插入圖片描述
如果是這樣的,就會有一個零除法錯誤。

爲了避免這樣的錯誤發生,可以寫一個try/except語句:
在這裏插入圖片描述
捕捉值錯誤的同時也能捕獲零除法錯誤。一旦捕捉到,就會實行打印對應的語句。

不列出特定異常的except子句將處理try套件中引發的任何異常。當我們不確定有多少異常時,但是想全部捕獲,可以直接靠except:
在這裏插入圖片描述
這樣就能捕捉到python可能給我們帶來的每一個錯誤。

顯示異常的默認錯誤消息

異常對象:拋出異常時在內存中創建的對象。
–—通常此對象包含與異常相關的默認錯誤消息
–—可以將異常對象分配給except子句中的變量
(except子句使我們能夠進入並捕獲這個異常對象以獲取更多信息)
–—可以將異常對象變量傳遞給print函數以顯示默認錯誤消息。

def main():
    total = 0
	try:(有一個try語句試圖做一些事情)
		infile = open('sales_data.txt', 'r') (打開一個文件,讀取文件的第一行)
		string = infile.readline()
    except FileNotFoundError as exp:(運行except語句)
        print(exp)
該對象已存儲在內存中,而且能夠顯示出錯誤。

else子句

try/except語句可能包含可選的else子句,該子句出現在所有except子句之後。
----else子句與try 和 except子句對齊
----語法類似於決策結構中的else子句
----Else套件:僅在未引發異常的情況下,在try套件中的語句之後執行的語句塊。如果引發異常,則跳過else套件

格式:

try:
	statements
except exceptionName:
	statements
else:(只有在try成功的情況下才會運行。如果try不成功並且拋出錯誤,將只運行except子句。)
	statements

舉例:
在這裏插入圖片描述
如果傳遞12和0,實際上會導致ZeroDivisionError錯誤,就會打印except中對應的語句和異常的對象。
在這裏插入圖片描述
下面的例子中就是try中沒有造成任何錯誤:
就會跳下去運行else
在這裏插入圖片描述
在這裏插入圖片描述

finally子句

try/except語句可以包含可選的finally子句,它出現在所有except子句之後。
----與try 和 except子句對齊
----Finally套件:Finally子句後的語句塊
----無論是否發生異常,finally套件都會被執行
----目的是在退出之前執行清理。

所以可以用finally子句在退出except之前運行一些清理代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章