1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
"""
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" #传入字符串
#那么,其实这两种方式可以结合使用,形成强大的捕捉和处理能力