首頁 > 軟體

深入瞭解Python的例外處理機制

2021-12-08 16:00:10

什麼是異常?

def num(a, b):
    a = int(a)
    b = int(b)
    result = a / b
    print(result)

上面是一個很簡單的除法的函數,語法上沒有任何問題。

但是如果呼叫函數的時候,傳入字串。則會丟擲異常ValueError。且後續程式碼不會執行

再比如除數是0。那也將丟擲異常ZeroDivisionError。且後續程式碼不會執行

例外處理

格式

try:
    #程式程式碼
except [errorNmae]:
    #出現異常後的處理程式碼
[else:]
    #當try中程式碼沒有問題時,會執行else。但是try中不能有retrun
[finally:]
    #最後一定會被執行的程式碼

try-except 

格式一-try...except...

try:
    num('a', 'b')
except:
    print('你的程式出現了大問題!!!')
print('--------->end')

通過try-except處理異常,當捕獲到異常時,將執行except部分的程式碼。且程式不會終端,繼續向下執行。

格式二-try...except {errorName}...

上述處理異常的時候沒有區分異常情況。也可以捕獲異常的name,進行不同的處理。

try:
    num('a', 'b')
except ValueError:
    print('你的引數格式寫的不對!!!')
except ZeroDivisionError:
    print('你的除數是0!!!')
print('--------->end')

try:
    num(10, 0)
except ValueError:
    print('你的引數格式寫的不對!!!')
except ZeroDivisionError:
    print('你的除數是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('你的引數格式寫的不對!!!', error_msg_value)
except ZeroDivisionError as error_msg_zero:
    print('你的除數是0!!!', error_msg_zero)
print('--------->end')

這種使用errorName捕獲異常的情況。如果異常沒有被捕獲到,會一直向上拋,最終被python直譯器不過。列印錯誤資訊。

try-except-finally

無論是否丟擲異常,最後finally都會執行。

try:
    num('a', 'b')
except ZeroDivisionError as error_msg_zero:
     print('你的除數是0!!!', error_msg_zero)
finally:
    print('無論有沒有異常,finally都會執行')
print('--------->end')
 

-------------
輸出:
你的除數是0!!! division by zero
無論有沒有異常,finally都會執行
--------->end

但是如果異常沒有except沒有捕獲到異常,異常最後由python直譯器丟擲。那麼finally執行完後,後續的程式碼就不會執行了。

try:
    num('a', 'b')
# except ValueError as error_msg_value:
#     print('你的引數格式寫的不對!!!', error_msg_value)
except ZeroDivisionError as error_msg_zero:
     print('你的除數是0!!!', error_msg_zero)
finally:
    print('無論有沒有異常,finally都會執行')
print('--------->end')

try-except-else

當try中程式碼沒有問題時,會執行else。但是try中不能有retrun。

try:
    num(10, 2)
except ValueError as error_msg_value:
    print('你的引數格式寫的不對!!!', error_msg_value)
except ZeroDivisionError as error_msg_zero:
     print('你的除數是0!!!', error_msg_zero)
else:
    print('else')
finally:
    print('無論有沒有異常,finally都會執行')
print('--------->end')

 ---------------
輸出:
5.0
else
無論有沒有異常,finally都會執行
--------->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。

總結

本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!


IT145.com E-mail:sddin#qq.com