报错 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 def chufa (a,b ): try : ret = a/b return ret except Exception as e: print (e) print ("出错了" ) else : finally : ret = chufa(5 ,0 )print (ret)def add (a, b ): if type (a)!=int or type (b) != int : raise TypeError("我这里只要int, 不要别的类型" ) return a + b add(123 , "abc"
自定义异常返回 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 class GenderError (Exception ): pass class Person : def __init__ (self,name,gender ): self.name = name self.gender = genderdef xi (per ): if per.gender != '男' : raise GenderError("这里是男澡堂" ) else : print ("进去了" ) p1 = Person('tudou' ,"不详" ) p2 = Person('mantou' ,'男' )import traceback try : xi(p2)except GenderError as g: print (g) val = traceback.format_exc() print (val)
类的约束 约束是对子类进行的约束。
在父类中给出一个方法。 这个方法中什么都不写。 就抛异常。 NotImplementError()
在子类中把上述的方法进行重写。
在子类中把上述的方法进行重写。
python中有两种办法来解决这样的问题.
提取父类. 然后在父类中定义好方法. 在这个方法中什么都不用干. 就抛一个异常就可以了. 这样所有的子类都必须重写这个方法. 否则. 访问的时候就会报错.
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 class Base : def login (self ): raise NotImplementedError("没有实现login方法" ) def kantie (self ): raise Gk("没有看帖功能" )class Normal (Base ): def login (self ): print ("普通人登录" ) class Menber (Base ): def l (self ): print ("吧务登录" ) class Admin (Base ): def login (self ): print ("管理员登录" )def login (obj ): print ("产生验证码" ) obj.login() print ("进入主页" ) n = Normal() m = Menber() a = Admin() login(n) login(m) login(a)
使⽤用元类来描述父类. 在元类中给出一个抽象方法. 这样子类就不得不给出抽象方法的具体实现. 也可以起到约束的效果.
python中编写⼀一个抽象类比较⿇麻烦. 需要引入abc模块中的ABCMeta和 abstractmethod这两个内容. 来我们看一个例例⼦子.
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 from abc import ABCMeta,abstractmethodclass Base (metaclass=ABCMeta): @abstractmethod def login (self ):pass class Normal (Base ): def login (self ): print ("::普通人登陆" )class Member (Base ): def login (self ): print ("::吧务登陆" )class Admin (Base ): def login (self ): print ("::管理员登陆" )def login (obj ): print ("1.产生验证码" ) obj.login() print ("3.进入主页" ) n = Normal() m = Member() a = Admin() login(n) login(m) login(a)
总结: 约束. 其实就是⽗类对⼦类进行约束. 子类必须要写xxx方法. 在python中约束的
方式和方法有两种:
使用抽象类和抽象方法, 由于该方案来源是java和c#. 所以使用频率还是很少的
使用人为抛出异常的方案. 并且尽量量抛出的是NotImplementError. 这样比较专业, 而且错误比较明确.(推荐)
异常类型 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError 输入/输出异常;基本上是无法打开文件 ImportError 无法引入模块或包;基本上是路径问题或名称错误 IndentationError 语法错误(的子类) ;代码没有正确对齐 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5 ] KeyError 试图访问字典里不存在的键 KeyboardInterrupt Ctrl+C被按下 NameError 使用一个还未被赋予对象的变量 SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了) TypeError 传入对象类型与要求的不符合 UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量, 导致你以为正在访问它 ValueError 传入一个调用者不期望的值,即使值的类型是正确的 常用异常
Exception 万能异常
异常处理 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 def chu (a, b ): return a/b ret = chu(10 , 0 ) print (ret)def chu (a, b ): return a/btry : ret = chu(10 , 0 ) print (ret)except Exception as e: print ("除数不不能是0" ) 结果: 除数不不能是0 try : print ("各种操作...." )except ZeroDivisionError as e: print ("除数不不能是0" )except FileNotFoundError as e: print ("⽂文件不不存在" )except Exception as e: print ("其他错误" )
MD5
MD5是一种不可逆的加密算法. 它是可靠的. 并且安全的. 在python中我们不需要手写 这一套算法. 只需要引入一个叫hashlib的模块就能搞定MD5的加密工作
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 import hashlib obj = hashlib.md5() obj.update("root" .encode("utf-8" )) val = obj.hexdigest()print (val)import hashlibdef my_md5 (yal ): obj = hashlib.md5() obj.update(yal.encode("utf-8" )) val = obj.hexdigest() return val name = input ("name" ) passwd = input ("passwd" )if name == "man" and my_md5(passwd) == "63a9f0ea7bb98050796b649e85481845" : print ('go' )else : print ("n" )
使用实例
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 import hashlibimport osimport sysimport hashlibdef md5sum (obj ): hash = hashlib.md5() hash .update(obj.encode('utf-8' )) return hash .hexdigest()def GetStrMd5 (src ): m0 = hashlib.md5() m0.update(src) print (m0.hexdigest()) pass def GetFileMd5 (filename ): if not os.path.isfile(filename): return myhash = hashlib.md5() f = open (filename, 'rb' ) while True : b = f.read(8096 ) if not b: break myhash.update(b) f.close() return myhash.hexdigest()def CalcSha1 (filepath ): with open (filepath, 'rb' ) as f: sha1obj = hashlib.sha1() sha1obj.update(f.read()) hash = sha1obj.hexdigest() print (hash ) return hash def CalcMD5 (filepath ): with open (filepath, 'rb' ) as f: md5obj = hashlib.md5() md5obj.update(f.read()) hash = md5obj.hexdigest() print (hash ) return hash if __name__ == "__main__" : if len (sys.argv) == 2 : hashfile = sys.argv[1 ] if not os.path.exists(hashfile): hashfile = os.path.join(os.path.dirname(__file__), hashfile) if not os.path.exists(hashfile): print ("cannot found file" ) else : CalcMD5(hashfile) else : CalcMD5(hashfile) else : print ("no filename" )
日志处理
导入logging模块.
简单配置⼀一下logging
出现异常的时候(except). 向⽇日志⾥里里写错误信息.
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 import logging logging.basicConfig(filename='app.log' , format ='%(asctime)s - %(name)s - %(levelname)s - %(module)s: %(message)s' , datefmt='%Y-%m-%d %H:%M:%S' , level=40 ) import tracebackfor i in range (20 ): try : if i % 3 == 0 : raise FileNotFoundError("我是FileNotFountException" ) elif i % 3 == 1 : raise StopIteration() elif i % 3 == 2 : raise KeyError() except FileNotFoundError as e: val = traceback.format_exc() logging.error(val) except StopIteration as e: val = traceback.format_exc() logging.error(val) except KeyError as e: val = traceback.format_exc() logging.error(val) except Exception as e: val = traceback.format_exc() logging.error(val)
多文件日志处理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 file_handler = logging.FileHandler('l1.log' , 'a' , encoding='utf-8' ) file_handler.setFormatter(logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s" )) logger1 = logging.Logger('A' , level=40 ) logger1.addHandler(file_handler) logger1.error('我是A系统' ) file_handler2 = logging.FileHandler('l2.log' , 'a' , encoding='utf-8' ) file_handler2.setFormatter(logging.Formatter(fmt="%(asctime)s - %(name)s -%(levelname)s -%(module)s: %(message)s" )) logger2 = logging.Logger('B' , level=40 ) logger2.addHandler(file_handler2) logger2.error('我是B系统' )