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下的代码
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())