1. 程式人生 > >Python——寫自己的異常(形成強大的捕捉和處理能力)

Python——寫自己的異常(形成強大的捕捉和處理能力)

字符 測試 lag gic 格式 swd for gin don

""" 1、編寫自己的異常時,通常是繼承Exception 2、如果繼承的是BaseException,那麽就不會被通用的except Exception捕捉到 3、自己定義的異常Python不會自動觸發,需要自己觸發,用raise進行觸發 4、python只會自動觸發它自己本身內置的異常,如IndexEerror,NameError,IOError等,只要是Error結尾通常都是內置異常 """ class MyException(Exception): def __init__(self, msg): #msg參數用於接收自己觸發異常時傳進來的錯誤描述信息 self.msg = msg def __str__(self): #格式化輸出 return "[Internal Logic Error:] %s" % (self.msg) #例子1: # if __name__ == '__main__': # flag = False # try: # if flag: # print("Initialization data") # print("done...") # else: # raise MyException("no data") #觸發自己的異常 # except MyException as err: #捕捉被觸發的自定義異常 # print(err) #打印異常信息,如果有參數,那麽可通過err.args打印參數 #例子2:在自定義的異常中能否捕捉內置異常呢? # if __name__ == '__main__': # a = [1,2,3,4] # # print(a[10]) # 將這一句放在這裏,則拋出IndexError: list index out of range,且程序停止運行 # flag = False # try: # if flag: # print("Initialization data") # print("done...") # print(a[10]) #這裏訪問一個不正確的索引,似乎捕捉不到 # else: # raise MyException("no data") #觸發自己的異常 # except MyException as err: #捕捉被觸發的自定義異常 # print(err) #打印異常信息,如果有參數,那麽可通過err.args打印參數 #******************編寫一個需要給定初始值的自定義異常類**************** class LoginExce(Exception): def __init__(self, username, password): super().__init__("your username:{name} and passwd:{pwd} is error".format(name=username, pwd=password)) self.user = username self.pwd = password def log(self): print("登錄異常記錄到日誌...") log_err_info = ("u:%s p:%s login failed" % (self.user, self.pwd)) # if __name__ == '__main__': # auth = False #這標誌位用於模擬登錄的狀態 # try: # if auth: # print("登錄成功...") # else: # raise LoginExce("toby", "1qaz@WSX") #如登錄失敗則引發異常 # except LoginExce as err: #捕捉這個異常 # err.log() #調用異常類的日誌記錄的方法 # print(err) #打印異常信息 # # 根據上面的測試得知,只有在引發了自定義的異常後,才能訪問到異常的實例,名字叫err #看下面兩個函數,一個是用if,還有一個是通過捕捉異常 def func_a(num): try: print(100 / num) except (ZeroDivisionError, TypeError): print("value Value can not be illegal") def func_b(num): if num == 0: print("value Value can not be 0") return if isinstance(num, str): print("value Value can not be str") return else: print(100 / num) func_a(0) func_b(0) func_a("abc") #傳入字符串 func_b("abc") #傳入字符串 #那麽,其實這兩種方式可以結合使用,形成強大的捕捉和處理能力


Python——寫自己的異常(形成強大的捕捉和處理能力)