關於Python的異常問題

2021-10-06 11:05:49 字數 3515 閱讀 2286

目標

•異常的概念

•捕獲異常

•異常的傳遞

•丟擲異常

異常的概念

•程式在執行時,如果 python 直譯器 遇到 到乙個錯誤,會停止程式的執行,並且提示一些錯誤資訊,這就是 異常

•程式停止執行並且提示錯誤資訊 這個動作,我們通常稱之為:丟擲(raise)異常

001_異常示意圖

程式開發時,很難將 所有的特殊情況 都處理的面面俱到,通過 異常捕獲 可以針對突發事件做集中的處理,從而保證程式的 穩定性和健壯性

捕獲異常

2.1 簡單的捕獲異常語法

•在程式開發中,如果 對某些**的執行不能確定是否正確,可以增加 try(嘗試) 來 捕獲異常

•捕獲異常最簡單的語法格式:

try:

嘗試執行的**

except:

出現錯誤的處理

•try 嘗試,下方編寫要嘗試**,不確定是否能夠正常執行的**

•except 如果不是,下方編寫嘗試失敗的**

簡單異常捕獲演練 —— 要求使用者輸入整數

try:

# 提示使用者輸入乙個數字

num = int(input(「請輸入數字:」))

except:

print(「請輸入正確的數字」)

2.2 錯誤型別捕獲

•在程式執行時,可能會遇到 不同型別的異常,並且需要 針對不同型別的異常,做出不同的響應,這個時候,就需要捕獲錯誤型別了

•語法如下:

try:

# 嘗試執行的**

pass

except 錯誤型別1:

# 針對錯誤型別1,對應的**處理

pass

except (錯誤型別2, 錯誤型別3):

# 針對錯誤型別2 和 3,對應的**處理

pass

except exception as result:

print(「未知錯誤 %s」 % result)

•當 python 直譯器 丟擲異常 時,最後一行錯誤資訊的第乙個單詞,就是錯誤型別

異常型別捕獲演練 —— 要求使用者輸入整數

需求1.提示使用者輸入乙個整數

2.使用 8 除以使用者輸入的整數並且輸出

try:

num = int(input(「請輸入整數:」))

result = 8 / num

print(result)

except valueerror:

print(「請輸入正確的整數」)

except zerodivisionerror:

print(「除 0 錯誤」)

捕獲未知錯誤

•在開發時,要預判到所有可能出現的錯誤,還是有一定難度的

•如果希望程式 無論出現任何錯誤,都不會因為 python 直譯器 丟擲異常而被終止,可以再增加乙個 except

語法如下:

except exception as result:

print(「未知錯誤 %s」 % result)

2.3 異常捕獲完整語法

•在實際開發中,為了能夠處理複雜的異常情況,完整的異常語法如下:

•else 只有在沒有異常時才會執行的**

•finally 無論是否有異常,都會執行的**

•之前乙個演練的 完整捕獲異常 的**如下:

try:

num = int(input(「請輸入整數:」))

result = 8 / num

print(result)

except valueerror:

print(「請輸入正確的整數」)

except zerodivisionerror:

print(「除 0 錯誤」)

except exception as result:

print(「未知錯誤 %s」 % result)

else:

print(「正常執行」)

finally:

print(「執行完成,但是不保證正確」)

異常的傳遞

•異常的傳遞 —— 當 函式/方法 執行 出現異常,會 將異常傳遞 給 函式/方法 的 呼叫一方

•如果 傳遞到主程式,仍然 沒有異常處理,程式才會被終止 提示

•在開發中,可以在主函式中增加 異常捕獲

•而在主函式中呼叫的其他函式,只要出現異常,都會傳遞到主函式的 異常捕獲 中

•這樣就不需要在**中,增加大量的 異常捕獲,能夠保證**的整潔

需求1.定義函式 demo1() 提示使用者輸入乙個整數並且返回

2.定義函式 demo2() 呼叫 demo1()

3.在主程式中呼叫 demo2()

def demo1():

return int(input(「請輸入乙個整數:」))

def demo2():

return demo1()

try:

print(demo2())

except valueerror:

print(「請輸入正確的整數」)

except exception as result:

print(「未知錯誤 %s」 % result)

丟擲 raise 異常

4.1 應用場景

•在開發中,除了 **執行出錯 python 直譯器會 丟擲 異常之外

•還可以根據 應用程式 特有的業務需求 主動丟擲異常

示例•提示使用者 輸入密碼,如果 長度少於 8,丟擲 異常

024_自定義異常

注意•當前函式 只負責 提示使用者輸入密碼,如果 密碼長度不正確,需要其他的函式進行額外處理

•因此可以 丟擲異常,由其他需要處理的函式 捕獲異常

4.2 丟擲異常

•python 中提供了乙個 exception 異常類

•在開發時,如果滿足 特定業務需求時,希望 丟擲異常,可以: 1.建立 乙個 exception 的 物件

2.使用 raise 關鍵字 丟擲 異常物件

需求•定義 input_password 函式,提示使用者輸入密碼

•如果使用者輸入長度 < 8,丟擲異常

•如果使用者輸入長度 >=8,返回輸入的密碼

def input_password():

# 1. 提示使用者輸入密碼

pwd = input("請輸入密碼:")

# 2. 判斷密碼長度,如果長度 >= 8,返回使用者輸入的密碼

if len(pwd) >= 8:

return pwd

# 3. 密碼長度不夠,需要丟擲異常

# 1> 建立異常物件 - 使用異常的錯誤資訊字串作為引數

ex = exception("密碼長度不夠")

# 2> 丟擲異常物件

raise ex

try:

user_pwd = input_password()

print(user_pwd)

except exception as result:

print(「發現錯誤:%s」 % result)

JAVA關於異常的相關問題

異常處理是程式的重要組成部分。runtimeexception 點這裡 ioexception io異常 nullpoiterexception 空指標異常 classcastexception 型別轉換異常 arrayindexoutofbound ception 陣列越界異常 numberfor...

關於空指標異常問題

一直都覺得空指標異常很好改,但是今天竟然調了一上午,鬱悶吶,因此開始總結教訓 首先svo是前端所傳的物件,判斷是否為空,如果為空則進行例項化 if svo null string project num svo.getprojectnum if project num.equals root nod...

關於藍芽異常斷開的問題

在做藍芽開發的時候,遇到了藍芽會異常斷開的問題。專案需求的功能是要求連線兩個藍芽ble裝置。乙個藍芽a裝置要求的即時性不高,可以掃瞄一段時間然後停止掃瞄一段時間,但是另外乙個藍芽b裝置要求的即時行較高需要系統去不停的掃瞄 以便在發現裝置後能夠迅速的做出反應。就這樣在裝置連線上其中的a藍芽後,在掃瞄b...