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

"""
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") #傳入字符串
#那麼,其實這兩種方式可以結合使用,形成強大的捕捉和處理能力


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章