异常

定义:程序报错

常见的错误

KeyboardInterrupt 用户主动结束程序时触发

AttributeError:访问类里面没有的属性

TypeError:访问非法数据类型

Exception:通用异常,前几种能捕获到的异常,在这个里面都能捕获

异常处理机制

捕获异常并且让程序运行起来

使用关键字Try except finally else等组合成不同的异常处理机制

异常处理分为三种

1.捕获单个异常

格式

try:

​ #有可能发生异常的代码

except 某个异常:

​ #异常发生后要执行的代码

else:

​ #如果没有异常发生,在try执行完毕后执行这里的代码

finally:

​ #不管有没有捕获道异常,最后都会执行

(else和finally属于可选项)

# 捕获单个异常
try:
    x = 18
    y = 0
    print(x/y)
except ZeroDivisionError:
    print('除数不能为0')
else:
    print("没有捕获到异常,代码正常运行")
finally:
    print("不管有没有捕获到异常,我都会正常运行")

2.捕获多个异常

格式:

try:

​ #有可能发生异常的代码

except (第一个异常,第二个异常..):

​ #异常发生后要执行的代码

else:

​ #如果没有异常发生,在try执行完毕后执行这里的代码

finally:

​ #不管有没有捕获道异常,最后都会执行

# 捕获多个异常
# 1.本质还是单个异常捕获
try:
    x = 18
    y = 0
    print(x / y)
except ZeroDivisionError:
    print('除数不能为0')
except NameError:
    print('变量未定义')
else:
    print("没有捕获到异常,代码正常运行")

# 2.本质为多个异常捕获,使用元组去接收可能出现的异常
try:
    x = 18
    y = 0
    print(x / y)
except (ZeroDivisionError, NameError):
    print('除数不能为0')
else:
    print("没有捕获到异常,代码正常运行")

3.捕获所有的异常

格式:

try:

​ #有可能发生异常的代码

except Exception:

​ #异常发生后要执行的代码

else:

​ #如果没有异常发生,在try执行完毕后执行这里的代码

finally:

​ #不管有没有捕获道异常,最后都会执行

# 捕获所有的异常
try:
    x = 18
    y = 0
    print(x / y)
except Exception:
    print('除数不能为0')
else:
    print("没有捕获到异常,代码正常运行")
# 但通常我们不知道会发生啥 我们就会在Exception后 补上as e再将e打印出来就可以看到发生了什么错误
try:
    x = 18
    y = 0
    print(x / y)
except Exception as e:
    print(e)  # 打印出现异常的具体描述
# else:
#     print("没有捕获到异常,代码正常运行")  else语句可有可无,看需求

使用关键字raise手动抛出异常,格式:

raise Exception (arg) 其中Exception是抛出的异常,arg是提供关于异常的描述信息

# 通过raise关键字手动抛出异常
import time
for i in range(100):
    print(i)
    time.sleep(1)
    raise NameError ('我手动抛出了异常

自定义异常

可以自己定义属于自己的异常类型,但必须继承Exception类,其格式为:

class 类异常名(Exception)

在python中记录日志使用logging库,日志的级别:

1.CRITICAL:系统崩溃级别的错误,必须立即处理

2.ERROR;运行时的错误,可能导致程序无法正常运行

3.WARNING:警告信息

4.INFO:信息性消息,程序正常运行

5.DEBUG;详细信息,通常在诊断问题时使用