"""
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") #传入字符串
#那么,其实这两种方式可以结合使用,形成强大的捕捉和处理能力