|
一般情況下,在Python無法正常處理程序時就會發(fā)生一個異常,彈出一大串英文提示。對于一般用戶來說會無所適從,影響用戶體驗,嚴重的會導致程序崩潰。我們需要對異常捕獲進行處理。 一、異常處理的語法:try:<語句> #要執(zhí)行的代碼except <名字1>:#捕獲異常名<語句> #對捕獲的異常進行處理except <名字2>:#如果對多個異常一并處理,用逗號分隔異常名<語句> else:<語句> #如果沒有異常發(fā)生 例如: try: print('-'*20) #把符號打印20遍,python特有的語法功能,方便易用吧 n1=input('input first num:') n2=input('input second num:') print(int(n1)/int(n2)) print('-'*20)except ZeroDivisionError: print('除數(shù)不能為0!')except ValueError: print('只能輸入數(shù)字!')運行結果: --------------------input first num:7input second num:0除數(shù)不能為0!>>> --------------------input first num:ainput second num:5只能輸入數(shù)字! 二、捕獲異常的描述信息把描述信息用as 保存到變量中,這樣就看到系統(tǒng)提示的英文異常了。如下例: try: print('-'*20) n1=input('input first num:') n2=input('input second num:') print(int(n1)/int(n2)) print('-'*20)except (ZeroDivisionError, ValueError) as desc: print('捕捉到異常:%s' %desc)結果: --------------------input first num:5input second num:0捕捉到異常:division by zero 三、捕獲所有的異常異常會有很多,常常防不勝防。這時,我們可以不指明異常類型,讓它可以處理任何異常。 except : print('出錯了')也可以把具體的異常信息打印出來。except Exception as desc: print('捕捉到異常:%s' %desc)四、異常后處理發(fā)生異常后,有些事情必須要進行處理,比如變量釋放,鎖釋放,文件關閉等等,否則系統(tǒng)會崩潰。這些要處理的代碼要放在try....except...finally語句的finally區(qū)。如下例: finally: f.close() print('釋放資源') 注意: try....except...else...finally,順序不能反,else和finally可選,else語句的存在以except存在為前提。 五、主動拋出異常raise顯式地觸發(fā)異常,如下例: try: raise IndexErrorexcept IndexError: print('索引越界')except: print('出錯了')結果: 索引越界 附:常見異常 1. NameError 訪問一個未申明的變量,會引發(fā)NameError異常。 2. ZeroDivisionError 被0除,會引發(fā)ZeroDivisionError異常。 3. SystaxError 語法錯誤,會引發(fā)SystaxError異常。 4. IndexError 訪問序列中不存在的索引時,會引發(fā)IndexError異常。 5. KeyError 訪問dictionary中不存在的鍵時,會引發(fā)KeyError異常。 6. FileNotFoundError 訪問不存在的文件,會引發(fā)FileNotFoundError異常。 7. AttributeError 訪問不存在的對象屬性時,會引發(fā)AttributeError異常。 六、assert斷言斷言指期望用戶滿足指定的條件,當不滿足用戶定義的約束條件時,它會觸發(fā)AssertionError異常??梢钥醋魇菞l件式的raise語句。格式如下: Assert 邏輯表達式,data #data是可選的 等同于: If not 邏輯表達式: raise AssertionError(data) 如下例: a=0assert a != 0,'a值不能為0!' 結果: Traceback (most recent call last): File 'D:/pyTest/test.py', line 2, in <module> assert a != 0,'a值不能為0!'AssertionError: a值不能為0! 七、自定義異常先定義一個繼承Exception類的子類,再用raise調(diào)用這個異常類。如下例: class ShortInputException(Exception): #定義一個異常類 def __init__(self, pw): self.pw = pwtry: text=input('請輸入密碼:') if len(text) < 6: raise ShortInputException(text)except ShortInputException: print('密碼長度不能小于6位!')except Exception as desc: print('出錯了:%s' %desc)運行結果: 請輸入密碼:1234密碼長度不能小于6位! 八、預定義清理Finally可以關閉文件,清理資源。除了finally手動釋放資源外,還可以用with語句預定義清理操作,即無論資源在使用過程中是否發(fā)生異常,都會執(zhí)行清理的操作,比如文件使用后自動關閉。 With 上下文表達式 [as 資源對象]: 對象的操作 上下文表達式:返回一個上下文管理器對象。若指定了as子句,該對象并不賦值給資源對象,而是將上下文管理器的__enter__()方法的返回值賦值給資源對象。 資源對象:可以是單個變量,也可以是元組。 對象的操作:with語句包裹的代碼塊。在執(zhí)行該代碼塊之前,會調(diào)用上下文管理器的__enter__()方法;在執(zhí)行該代碼塊之后,會執(zhí)行__exit__()方法。 如下例: with open(“/tmp/abc.txt”) as file: data=file.read() 使用with語句打開文件,如果能打開則將文件對象賦值給file,然后執(zhí)行with語句的代碼塊,讀文件。代碼塊執(zhí)行完畢后,with語句會關閉文件。即使代碼塊運行過程中產(chǎn)生了異常,with語句也會關閉文件。 |
|
|
來自: 星光閃亮圖書館 > 《Python學習》