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