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())