Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 548|回复: 0

python异常处理,日志处理

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-4-19 14:02:36 | 显示全部楼层 |阅读模式
    整体的流程
      try:
        '需要测试代码块'
    except + 异常的类型,如果实在知道会出现什么样的类型,可以直接使用Exception ,它是所有异常类型的根
    # 在这也可以使用except + 异常类型 + as  变量 : 这可以将捕获到的异常类型赋值该变量
    
    else:
        '当try的使用的代码没有出现异常的时候,就执行这里的命令'
    finally:
        '无论try下面有没有抛出异常,这里的命令都会执行'

     

    也可以将多个异常的类型在同一个except 下面执行

    try:

           input(“please input the frist number:”)

           input(“please input the second number:”)

    except(TypeError,NameError): #多个异常,无论匹配到哪个都可以执行下面的命令

           print(“what you intput is  wrong”)

     

    如果想知道发生的是什么异常,可以这样子操作

     except(TypeEorror,NameError) as pan:

          print(pan)

    这样的话,在出现错误的时候会打印相应的错误,之后再正常运行其他的命令

     

    当用户没有按照程序的提示直接乱输入东西的时候, 我们可以通过抛出异常,去通知用户

    引发异常

    raise  语句 引发异常用的数据,一般是用于测试

    raise Exception:   只是显示默认的异常,是所有异常的根

    raise Exception(‘I love my mother’)  如果出现这类的异常的话,会直接显示自己定义的信息

    注意的是当程序运行到raise的时候就会中断程序,并将异常返回给调用方,如果调用方没有处理的话,最终会抛给用户

     

    自定义异常(只是创建一个类,并继承Exception)

    class GenderException(Exception):
        pass
    
    class Person:
        def __init__(self,name,gender):
            self.name = name
            self.gender = gender
        def Go_to(self):
            if self.gender != '':
                try:
                    raise GenderException('你确定你是男的')
                except GenderException:
                    print('我的天')
            else:
                print('你好啊,你来了')
    
    p1 = Person('cc','')
    p1.Go_to()
    
    
    在调试的时候常用的模块是traceback,用来追踪异常返回信息
    import traceback
    try:
        raise SyntaxError("traceback test")
    except:
        traceback.print_exc()#这只是打印异常的返回信息,可以在括号内设置保存
        traceback.format_exc()#这个是获取异常的返回信息,但是没有打印

     

    注意的是如果在except 下使用raise 后面没有带任何的错误的类型的话,那么其引发的异常是重新引发该子句捕获到的异常

     

    例如异常程序在读取代码的时候, 用户使用CTRL +C 中断了程序,这是就会相应的动作表示程序中断

     

     

    出现这种情况的时候,如果想要程序还是能够正常执行,这时就可以使用finally 执行剩余的命令,例如上面打开了一个文件,这是就可以通过使用finally 将这个文件关闭

     

    自定义的异常,在正常的情况下,自己虚拟出来的一个异常

     

    日志处理

    # import logging
    # # filename: 文件名
    # # format: 数据的格式化输出. 最终在日志文件中的样子
    # # 时间-名称-级别-模块: 错误信息
    # # datefmt: 时间的格式
    # # level: 错误的级别权重, 当错误的级别权重⼤于等于leval的时候才会写⼊⽂件
    # 当前配置表示 0以上的分数会被写文件
    # CRITICAL = 50
    # FATAL = CRITICAL
    # ERROR = 40
    # WARNING = 30
    # WARN = WARNING
    # INFO = 20
    # DEBUG = 10
    # NOTSET = 0
    import logging
    logging.critical("我是critical") # 50分. 最高的 logging.error("我是error") # 40分 logging.warning("我是warning") logging.info("我是info") logging.debug("我是debug") logging.log(1, "我什么都不是")
    上面只是简单将内容输出到屏幕,一般都是将日志输出到文本中的如下:

    方案1 :只是使用logging模块中的basicConfig (输出位置,日志格式,日志等级)
    import logging logging.basicConfig(filename='x1.log', format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S',file =
       level
    =30) #在这里设置记录的是什么等级以上的日志 logging.critical("我是critical") # 50分. 最高的 logging.error("我是error") # 40分 logging.warning("我是warning") logging.info("我是info") logging.debug("我是debug") logging.log(1, "我什么都不是") import traceback try: print(1/0) except Exception: logging.error(traceback.format_exc()) # 用法 print("出错了") #方案二:可以将日志写入到多个文件中 import logging # 创建一个操作日志的对象logger(依赖FileHandler) # file_handler = logging.FileHandler('自定义操作日志文本1.log', 'a', encoding='utf-8') file_handler.setFormatter(logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s")) logger1 = logging.Logger('qq', level=20) #这里是设置记录日志的name 和level等级,只有高于这个等级的才会写入到日志里面 logger1.addHandler(file_handler) # 把文件助手和日志对象绑定 logger1.error('我是A系统出错了') # 记录日志 # 再创建一个操作日志的对象logger(依赖FileHandler) file_handler2 = logging.FileHandler('自定义操作日志文本2.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=20) logger2.addHandler(file_handler2) import traceback try: print(1/0) except Exception: logger2.critical(traceback.format_exc()) print("出错了. 请联系管理员") print("程序继续知悉个")

     format参数中可能用到的格式化串:
    %(name)s Logger的名字
    %(levelno)s 数字形式的日志级别
    %(levelname)s 文本形式的日志级别
    %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
    %(filename)s 调用日志输出函数的模块的文件名
    %(module)s 调用日志输出函数的模块名
    %(funcName)s 调用日志输出函数的函数名
    %(lineno)d 调用日志输出函数的语句所在的代码行
    %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
    %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
    %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
    %(thread)d 线程ID。可能没有
    %(threadName)s 线程名。可能没有
    %(process)d 进程ID。可能没有
    %(message)s用户输出的消息

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-22 17:39 , Processed in 0.056378 second(s), 27 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表