目標
•異常的概念
•捕獲異常
•異常的傳遞
•丟擲異常
異常的概念
•程式在執行時,如果 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...