python小白之路:第五章 模块、包与库 第五节 异常处理

异常处理

非正常,没有达到预期目标;

是一个事件,并且这个事件在我们程序的运行过程中出现,会影响程序的正常运行。

两种: 1.语法错误导致的异常; 2.逻辑错误导致的异常

常见异常类 : 网上都有

如何处理:
如果错误发生的情况可以预知,那么就可以使用流程控制进行预防处理
如果错误发生的情况不可预知,那么可以用try…except…在错误发生时进行处理

try except用法

1.不指定错误类型,只要发生就进入except:

 try:
     # 可能发生异常错误的代码
     list_1 = ['1']
     print(list_1[2])
 except:
     # 如果发生异常则进入except代码块进行处理
     print('Error')

# Error

2.指定异常类,不是指定的异常类就不进入:

try:
     print(a+b)
except IndexError as e :
     print('IndexError')

# NameError: name 'a' is not defined

3.可以多分支处理异常类:

try:
     print(a + b)
except IndexError as e:
     print('IndexError')
except NameError as n:
     print('NameError')

  # NameError

4.通用异常类 Exception:

try:
     print(a + b)
except Exception as e:
     print('Error')

# Error

5.可以多分支+通用处理异常类:

 try:
     print(a + b)
 except IndexError as e:
     print('IndexError')
 except Exception as t:
     print('Error')

# Error

6.try…except…else :

 try:
     a = 1
 except IndexError as e:
     print('IndexError')
 else:
     # try代码块中没有发生异常时,执行这个区间
     print('True')

# True

7.try…except…else…finally :

try:
    a = 1
except IndexError as e:
    print('IndexError')
else:
    print('True')
finally:
    # 无论是否发生异常,都会执行这个代码块
    print('Over')

# True
# Over

8.使用raise主动抛出异常:

 a = 2
 try:
     if a != 1 :
         raise Exception('Error',a)

 except IndexError as e:
     print('IndexError')

# Exception: ('Error', 2)

9.断言语句 assert:

 assert 2 == 1

# AssertionError

 assert 1 == 1

#

自定义异常处理类

1.当异常出现时,对异常信息进行处理并写入日志:

日志的基本格式:
日期时间 异常的级别 异常信息:引发的异常类,异常的信息,文件及行号

2.import traceback,logging 日志模块:

通过回溯和logging模块获取异常信息

 import traceback
 import logging

 try:
     int('aa')
 except:
     errormsg = traceback.format_exc()
     logging.error(errormsg)
     print(errormsg)

# ERROR:root:Traceback (most recent call last):
#   File "(文件地址)", line 129, in 
#     int('aa')
# ValueError: invalid literal for int() with base 10: 'aa'

# Traceback (most recent call last):
#   File "(文件地址)", line 129, in 
#     int('aa')
# ValueError: invalid literal for int() with base 10: 'aa'

3.自定义异常日志处理类:

class My():
    def __init__(self):
        import traceback
        import logging

        # logging基本配置
        
        logging.basicConfig(
            filename='./error.txt', # 存储的文件及目录
            format='%(asctime)s  %(filename)s : [line:%(lineno)d] %(levelname)s', # 格式化存储的日志格式
            datefmt='%Y-%m-%d %H:%M:%S',  # 时间的格式
        )
        logging.error(traceback.format_exc())

4.使用异常日志处理类:

try:
    int('aa')
except:
    My()

# error.txt -> 2020-06-29 12:49:59  异常处理.py : [line:159] ERROR

你可能感兴趣的:(小白python)