python基础_023__try异常和日志的使用

1、trytry except语句总结

1、异常就是程序运行时出现了错误,可以用try捕捉
2、 try except语句,至少有一个except,也可以有多个,也可以有一个else语句,一个finally语句

3、 在有可能出错的代码前面加上try,然后捕获到错误之后,在except下处理,
4、finally部分无论try会不会捕获错误都会执行,而且不是必须的
5、else 执行顺序,在程序没有报错的时候会执行else
6、注意 :else和finally只能同时出现一个
7、抛出异常后不在执行try代码块下面的代码
8、可以同时将多个错误类型写入到一个except下,对捕获到的一起处理
9、 如果不知道什么错误类型,可以写Exception来监听所有错误类型

10、手动抛出异常,使用raise关键字抛出


-------------------代码1
try:
    print(5 / 1)
except ZeroDivisionError:
    print("任何数不得除于0")
else:
    print("程序结束")


# 代码1输出结果:
# 5.0
# 程序结束

---------------------代码2
try:
    print(5 / 0)
except ZeroDivisionError:
    print("任何数不得除于0")
else:
    print("程序结束")


# 代码2输出结果: 任何数不得除于0

---------------------代码3
try:
    print(5 / 0)
except ZeroDivisionError:
    print("任何数不得除于0")
finally:
    print("finally部分无论try会不是捕获错误都会执行")


# 代码3输出结果:
# 任何数不得除于0
# finally部分无论try会不是捕获错误都会执行

--------------代码4 可以写多个捕获异常
try:
 
    data = [99, 88]
    print(data[3])     # 抛出 IndexError

    # 抛出异常后不在执行try代码块下面的代码
    print(5 / 0)

except ZeroDivisionError as e:
    print("任何数不得除于0", e)

except IndexError as index:  # 可以写多个捕获异常
    print("IndexError下标越界:  ", index)

finally:
    print("finally部分无论try会不是捕获错误都会执行")

# 代码4输出结果:
# IndexError下标越界:   list index out of range
# finally部分无论try会不是捕获错误都会执行


2、所有的异常,都是Exception的子类,或者子类的子类

--------------代码5
print(NameError.__base__)  # 输出结果:<class 'Exception'>
print(IndexError.__base__)  # 输出结果:<class 'LookupError'>
print(LookupError.__base__)  # 输出结果:<class 'Exception'>
print(FileNotFoundError.__base__)  # 输出结果:<class 'OSError'>
print(OSError.__base__)  # 输出结果:<class 'Exception'>

2.1 Exception也有一个父类, BaseException,BaseException的父类是objectException
print(Exception.__base__)  # 输出结果:<class 'BaseException'>

3、手动抛出异常,使用raise关键字抛出
try:
    raise IOError  # 假装这里出现了异常
except IOError:
    print('程序出现了IO异常')


3、日志的使用和存储

 
 1、需要导入logging模块
 2、日志级别:从低到高: debug < info < warning < error < critical

 3、log日志打印到控制台---解析点,对应代码5下的代码

 3.1、logging.basicConfig() 这句代码可写可不写默认等级是WARNING, 大于等于WARNING级及以上的才会反馈信息。
3.2、logging.basicConfig(level='INFO') 解析:其中参数1:level='INFO' 是指当异常大于等于INFO级别以上的就记录输出到控制台,INFO代表错误级别必须大写

3.3,以上写法,没有指定参数去存放log信息,会直接在控制台输出

4、log日志写入文件
# 4.1、代码:logging.basicConfig(level='DEBUG',
#                     filename='D:/210924.log',
#                     filemode='a',
#                     format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'
#                     )


# 4.2、解析:filename='D:/210924.log' 是日志信息存放的路径
# 4.3、解析: filemode='a' 打开一个文件用于追加。如果该文件已存在,在后面追加内容。如果该文件不存在,创建新文件进行写入,【a,a+,w,w+,r+,rb+】和文件读写方式设置是一样规则
# 4.4、解析: filemode='w' 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件
# 4.5、解析:format:设置的是--日志信息最后输出的规则、结构和内容
# 执行后D盘下面会生成一个【210924.log】文件,里面记录错误的信息

5、 Formatters
# Formatter对象设置日志信息最后的规则、结构和内容, 下面是Formatter常用的一些信息,可以自己设置自己想要的日志格式

# %(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         用户输出的消息


--------------------------------------------------------------------代码5 
import time
import logging
import traceback

# logging.basicConfig(level='INFO')
logging.basicConfig(level='DEBUG',  # 控制台打印的日志级别,不能低于DEBUG级别的错误,才会输出
                    filename='D:/210924.log',
                    filemode='a',  # filemode模式,有w和a,w就是写模式,每次都会重新写日志,覆盖之前的日志
                    format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'
                    # 日志格式,设置之后,会变得一目了然
                    )

logging.debug('debug级别,最低级别,一般开发人员用来打印一些调试信息')
logging.info('info级别,正常输出信息,一般用来打印一些正常的操作')
logging.warning('waring级别,一般用来打印警信息')
logging.error('error级别,一般用来打印一些错误信息')
logging.critical('critical 级别,一般用来打印一些致命的错误信息,等级最高')

# 捕捉到异常后打印原始报错信息,使用traceback模块
# import traceback  首先导入traceback模块
# traceback.format_exc()   此方法获取原始报错信息
# time.strftime('%y-%m-%d %H:%M:%S')   添加时间,以便查看是什么时候出现的异常,方便分析

try:
    input1 = int(input('请输入一个数字:  '))
    print(1 / input1)
except ZeroDivisionError:  # 0 作为分母的异常
    logging.error(time.strftime('%y-%m-%d %H:%M:%S') + traceback.format_exc())  # traceback.format_exc()  原始报错信息
except ValueError:  # 非数字异常
    logging.error(time.strftime('%y-%m-%d %H:%M:%S') + traceback.format_exc())
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值