1. 异常和错误定义
错误:修改程序无法解决的
异常:修改程序可以解决的
2. 异常类
异常类的继承结构:
BaseException是所有异常类的基类
异常类主要分为4种:
1. SystemExit
2. KeyboardInterrupt
3. GeneratiorExit
4. Exception,这个异常类的子类用的多
3. 异常处理
在程序运行时,常常会遇到异常从而使程序终止报错,但有时这种情况不是想要看到的,我们要的是虽然出现异常,但保证程序仍然执行,同时对出现的异常处理
要实现这个功能,可以捕获异常并处理
1. try...except...
try:
a = 1/0
b = 2
except ZeroDivisionError as z:
print(z) #打印的是异常信息
try:
a = 1/0
b = 2
print("-"*30)
for i in b:
print(i)
except (ZeroDivisionError,TypeError) as z:
print(z)
(1)try语法块中,遇到异常后会去执行except,不会执行后面的代码,即便有异常也检测不到
(2)由于(1),只能检测到一种异常,故z存储的异常信息不一定是第一个异常类。
2. try...except...except...except...
try:
a = 1/0
b = 2
print("-"*30)
for i in b:
print(i)
except ZeroDivisionError as z:
print(z)
except TypeError as t:
print(t)
3. try...except...else...
try:
a = 1/0
b = 2
print("-"*30)
for i in b:
print(i)
except (ZeroDivisionError,TypeError) as z:
print(z)
else:
print("meicuowu")
没有发生异常时,执行else语句块
4. try...except...else...finally...
try:
a = 1/0
b = 2
print("-"*30)
for i in b:
print(i)
except (ZeroDivisionError,TypeError) as z:
print(z)
else:
print("meicuowu")
finally:
print("wanyong")
无论是否发生异常,都会执行finally语法块
5. try...finally...
try:
a = 1/0
b = 2
print("-"*30)
for i in b:
print(i)
finally:
print("wanyong")
4. 手动抛出异常
raise 异常类,用于抛出异常,常常用于抛出自定义异常类,例如raise StopIteration
为什么要手动抛出异常:
因为手动抛出异常,可以终止程序的执行,例如自定义迭代器时raise StopIteration的使用
5. 自定义异常类
通常用户自定义的异常类是继承Exception类的,自定义异常类允许我们创建自己的错误类型,并为特定的代码块添加自定义的错误处理逻辑。
一般自定义异常类要实现:
- 定义一个__init__方法:在自定义异常类中,需要定义一个初始化方法__init__,用于初始化异常信息。通常,__init__方法会接收一些参数来设置异常信息,例如错误码、错误消息等。
- 重写__str__方法:在自定义异常类中,需要重写__str__方法,用于返回异常的描述信息。__str__方法负责定义异常对象转换为字符串时的行为。
class MyException(Exception): def __init__(self): self.code = 23 self.message = "我抛出的" def __str__(self): return f"{self.code}:{self.message}"