深入了解Python的異常處理機制
什么是異常?
def num(a, b):
a = int(a)
b = int(b)
result = a / b
print(result)
上面是一個很簡單的除法的函數(shù),語法上沒有任何問題。
但是如果調用函數(shù)的時候,傳入字符串。則會拋出異常ValueError。且后續(xù)代碼不會執(zhí)行

再比如除數(shù)是0。那也將拋出異常ZeroDivisionError。且后續(xù)代碼不會執(zhí)行

異常處理
格式
try:
#程序代碼
except [errorNmae]:
#出現(xiàn)異常后的處理代碼
[else:]
#當try中代碼沒有問題時,會執(zhí)行else。但是try中不能有retrun
[finally:]
#最后一定會被執(zhí)行的代碼
try-except?
格式一-try...except...
try:
num('a', 'b')
except:
print('你的程序出現(xiàn)了大問題?。?!')
print('--------->end')
通過try-except處理異常,當捕獲到異常時,將執(zhí)行except部分的代碼。且程序不會終端,繼續(xù)向下執(zhí)行。

格式二-try...except {errorName}...
上述處理異常的時候沒有區(qū)分異常情況。也可以捕獲異常的name,進行不同的處理。
try:
num('a', 'b')
except ValueError:
print('你的參數(shù)格式寫的不對?。?!')
except ZeroDivisionError:
print('你的除數(shù)是0?。。?)
print('--------->end')

try:
num(10, 0)
except ValueError:
print('你的參數(shù)格式寫的不對?。?!')
except ZeroDivisionError:
print('你的除數(shù)是0!??!')
print('--------->end')

格式三-try...except {errorName} as key...
except {errorName} as key。會將報錯的信息賦值給key
注意:Python中的錯誤類型也是class,所有錯誤類型都繼承自BaseException。所以excpt使用時要注意,如果錯誤類型還有子類型,也會將子類型一網打盡。
try:
num(10, 0)
except ValueError as error_msg_value:
print('你的參數(shù)格式寫的不對?。?!', error_msg_value)
except ZeroDivisionError as error_msg_zero:
print('你的除數(shù)是0!?。?, error_msg_zero)
print('--------->end')


這種使用errorName捕獲異常的情況。如果異常沒有被捕獲到,會一直向上拋,最終被python解釋器不過。打印錯誤信息。

try-except-finally
無論是否拋出異常,最后finally都會執(zhí)行。
try:
num('a', 'b')
except ZeroDivisionError as error_msg_zero:
print('你的除數(shù)是0!??!', error_msg_zero)
finally:
print('無論有沒有異常,finally都會執(zhí)行')
print('--------->end')
-------------
輸出:
你的除數(shù)是0?。?! division by zero
無論有沒有異常,finally都會執(zhí)行
--------->end
但是如果異常沒有except沒有捕獲到異常,異常最后由python解釋器拋出。那么finally執(zhí)行完后,后續(xù)的代碼就不會執(zhí)行了。
try:
num('a', 'b')
# except ValueError as error_msg_value:
# print('你的參數(shù)格式寫的不對?。?!', error_msg_value)
except ZeroDivisionError as error_msg_zero:
print('你的除數(shù)是0!??!', error_msg_zero)
finally:
print('無論有沒有異常,finally都會執(zhí)行')
print('--------->end')

try-except-else
當try中代碼沒有問題時,會執(zhí)行else。但是try中不能有retrun。
try:
num(10, 2)
except ValueError as error_msg_value:
print('你的參數(shù)格式寫的不對?。?!', error_msg_value)
except ZeroDivisionError as error_msg_zero:
print('你的除數(shù)是0?。。?, error_msg_zero)
else:
print('else')
finally:
print('無論有沒有異常,finally都會執(zhí)行')
print('--------->end')
?---------------
輸出:
5.0
else
無論有沒有異常,finally都會執(zhí)行
--------->end
拋出異常
格式
raise errorName('error message')
錯誤類型名可以自定義,但盡量使用Python內置錯誤類型。
def num(a, b):
result = a / b
print(result)
if result < 10:
raise ValueError('商小于10,不符合預期。')
num(10, 2)
?
raise還可以將一個錯誤類型轉換為另一個錯誤類型
def ch_type():
try:
result = 10 / 0
except ZeroDivisionError as err_msg:
raise Exception(err_msg)
ch_type()
原本錯誤類型ZeroDivisionError,改成了Exception。

總結
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!
相關文章
Pandas讀取excel合并單元格的正確方式(openpyxl合并單元格拆分并填充內容)
Excel文件中可能包含合并單元格的數(shù)據(jù),下面這篇文章主要給大家介紹了關于Pandas讀取excel合并單元格的正確方式,主要介紹的openpyxl合并單元格拆分并填充內容,需要的朋友可以參考下2023-06-06
python神經網絡TensorFlow簡介常用基本操作教程
這篇文章主要介紹了python神經網絡入門TensorFlow簡介常用基本操作教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2021-11-11
判斷Threading.start新線程是否執(zhí)行完畢的實例
這篇文章主要介紹了判斷Threading.start新線程是否執(zhí)行完畢的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05
python中@contextmanager裝飾器的用法詳解
這篇文章主要介紹了python中@contextmanager裝飾器的用法詳解,@contextmanager 的作用就是我們可以把一個非自定義類改成一個上下文管理器,需要的朋友可以參考下2023-07-07

