關于例外
在程式運行中,總會遇到各種各樣的錯誤,如打開一個不存在的檔案,程式期待用戶輸入數字,但用戶輸入了字串,網路傳輸終止等,如果不對這些可能引發例外的情況進行處理,就會導致拋出例外程式被終止,這樣對用戶體驗來說是很不友好的,所以為保證程式的健壯性,有必要對一些可能引發例外地方進行例外處理,
如下我們打開一個不存在的檔案:

例外語法
基本語法:
try: 被檢測的代碼塊 except 例外型別: 處理例外
下面對打開檔案例外進行處理
try: f = open('a.test') except FileNotFoundError as e: print(e)
處理后效果如下:

有了上面的例外處理后,程式便不會拋出例外正常執行了,例外處理還可以進行多分支處理,如下:
import json dict_1 = {'a':1,'b':2} json_obj = json.dumps(dict_1) try: print(json_obj.keys()) # 將json字串當字典使用,引發屬性例外 except ValueError as e: print(e) except AttributeError as e: print(e) except TypeError as e: print(e)
上面的示例在except 中指定了FileNotFoundError、ValueError、AttributeError等,這是我們猜測可能會引發這些例外,如果例外不在我們的分支中我們則無法捕獲對其進行處理了,上述只是在確定只有這幾種例外不會出現其它例外的情況下使用,如果不能保證,我們可以使用萬能的Except類,它可以接收所有例外,如下:
import json dict_1 = {'a':1,'b':2} json_obj = json.dumps(dict_1) try: print(json_obj.keys()) # 將json字串當字典使用,引發屬性例外 except Exception as e: # 萬能例外 print(e)
對比多分支和萬能例外Exception:
多分支邏輯結構更加清晰明確,可以根據具體的例外解決對應的問題,但容易出現想的不全面,導致引發其它例外造成程式終止,萬能例外Exception雖然可以接收所有例外,但它無法根據具體的例外去解決對應的問題,適用于無論引發什么例外我都執行一個結果,它們各有各的優點,也各有各的不足,多數情況我們可以將它們結合使用,如下:
import json dict_1 = {'a':1,'b':2} json_obj = json.dumps(dict_1) try: print(json_obj.keys()) # 將json字串當字典使用,引發屬性例外 except ValueError as e: print(e) except AttributeError as e: print(e) except TypeError as e: print(e) except Exception as e: # 萬能例外 print(e)
下面來看兩個比較有趣的else、finally
import json dict_1 = {'a':1,'b':2} json_obj = json.dumps(dict_1) try: print(json_obj) except ValueError as e: print(e) except AttributeError as e: print(e) except TypeError as e: print(e) except Exception as e: print(e) else: # 如果沒有發生例外,將被執行 print('如果沒有例外,我會被執行') finally: # 無論有沒有例外,都會被執行 print('無論有沒有例外,我都會被執行,通常是進行清理作業')
else:如果try沒有捕獲到例外,就執行else內的代碼塊,如果try捕獲到了例外,else的代碼塊就不會被執行,
finally:無論try捕獲到例外還是沒捕獲到例外都會被執行,
自定義例外
class MyException(Exception): ''' 自定義例外類 ''' def __init__(self,msg): self.msg = msg def __str__(self): return f'MyException:{self.msg}' num = input('請輸入3位純數字\n>>>') try: # 這里為了演示,所以使用raise主動拋出例外 if not num.isdecimal(): raise MyException('請輸入純數字') elif len(num) != 3: raise MyException('只能輸入3位純數字') except MyException as e: print(e) # 列印內容如下 請輸入3位純數字 >>>a12 MyException:請輸入純數字
raise 可主動拋出例外,
asset斷言:asset后面一般是一個運算式,如果運算式結果為True,不會觸發斷言,如果結果為False將觸發斷言AssertionError,
如下:引發斷言

斷言也屬于例外,因此也可以使用try進行捕獲,如下:
try: assert 1<0 except: print('觸發斷言')
這樣程式就不會因為斷言而終止了,斷言一般用于引數檢查,如果發現引數有誤直接拋出斷言終止,避免因為錯誤的引數導致程式的錯誤,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/148129.html
標籤:Python
