十九. Python基礎(19)--異常
1 ● 捕獲異常
if VS異常處理: if是預防異常出現, 異常處理是處理異常出現 異常處理一般格式: try: ????<...............> #可能得到異常的語句 except <.......>:???? #捕獲是哪種異常 ????<...............> #出現異常的處理方法 except <.......>:???? #捕獲是哪種異常 ????<...............> #出現異常的處理方法 else: ????< ............... > # 沒有出現異常的處理方法 finally: ????< ............... > # 最后一定會執行的語句 |
try: ???? #lst = [2,4,6] ???? #print(lst.index(5)) ???? print("##########") # 如果上面的語句觸發異常, 這一句不再執行, 下面的語句也都不會執行, 但是finally語句塊的語句會執行 ???? print(sum(1,2,3)) ???? print("##########") ???? f =open('file.txt') # 如果上面的語句出錯, 這一句就不會執行了, finally里面的語句也會因此提示出錯. ???? print(f.read()) # 程序出現異常后, 會按照下面的順序依次匹配, 最先匹配到哪個異常就捕獲哪個異常. # 在我們不能完全明確地知道這個錯誤到底是發生了什么的時候, 就用as 變量名, 將變量中儲存的錯誤信息打印出來. except ValueError as msg: # 或者寫成except ValueError, msg ????print("5不在列表中:", msg) # 5不在列表中: 5 is not in list # 如果寫成: except ValueError: 那么就不會打印python內部的定義的錯誤提示. except Exception as e: ????print("出現某種異常:", e) # 出現某種異常: sum expected at most 2 arguments, got 3 # Exception是萬能異常類,對于可預見的異常錯誤, 我們最好用已知的異常類型. 否則才用萬能異常類. # 上面的print(sum(1, 2, 3))這一句實際上觸發了TypeError異常, 所以最好把Exception改為TypeError else: # try代碼塊中沒有捕獲到異常的時候才會執行 ????print("程序沒有出現異常!") finally: # finally代碼塊中的代碼一定會執行; 主要做清理的工作, 把之前的打開的鏈接, 文件等關閉掉. ????f.close() # 如果連用else和finally, else要寫在finally之前. |
?
2 ● 自定義異常 & 類拋出異常
raise語句(比if 語句更暴力, 捕獲異常后, 直接停止程序) |
class MyError(BaseException): ????def __init__(self, msg): ????????self.msg = msg ????def __str__(self): ????????return self.msg ? file_name = input("pls input file name:") ? if file_name == 'hello': ????raise MyError('file name can\'t be "hello"!') ? ''' pls input file name:hello Traceback (most recent call last): File "D:/python_projects/s7code/day21/test_day21.py", line 172, in <module> ????raise MyError('file name can\'t be "hello"!') __main__.MyError: file name can't be "hello"! ''' ? # 程序要求用戶輸入一個文件名, # 如果用戶輸入的文件名是hello, 那么拋出一個NameError的異常 # 用戶輸入hello 和MyError異常之間沒有任何必然聯系 # 我們只是人為的通過raise來這樣定義 # 我們當然也可以定義成TypeError或其它名稱, 但我定義的異常類型必須是python提供的或派生的 |
?
3 ● assert語句
1、assert語句用來聲明某個條件是真的。 2、如果你非常確信某個條件為真(比如數學公理之類的),而你想要檢驗這一點,并且在它非真的時候引發一個錯誤,那么assert語句是應用在這種情形下的理想語句。 3、當assert語句失敗的時候,會引發一AssertionError。 |
def KelvinToCelsius(t): ????assert (t >= 0), "Colder than absolute zero!" ????return t - 273 ? print(KelvinToCelsius(1)) # -272 print(KelvinToCelsius(-5)) # AssertionError: Colder than absolute zero! ? # 注意, assert語句可以寫成assert t>= 0,"Colder than absolute zero!", # 但不能寫成assert((Temperature >= 0),"Colder than absolute zero!") # 因為在python2,3中,assert都是一個語句(statement) # 不像print在python3中變成了一個函數。 |
?
4 ● except:pass
except: ????pass # 如果在循環體內, 這個pass要寫成pass # 程序捕獲到異常時, 直接退出程序, 這是個不好的編程習慣, 但要了解這種寫法. |
?