常见异常类型
- AssertionError:当 assert 关键字后的条件为假时,程序运行会停止并抛出 AssertionError 异常
- AttributeError:当试图访问的对象属性不存在时抛出的异常
- IndexError:索引超出序列范围会引发此异常
- KeyError:字典中查找一个不存在的关键字时引发此异常
- NameError:尝试访问一个未声明的变量时,引发此异常
- OSError:操作系统产生的错误
- SyntaxError:Python的语法错误
- TypeError:不同类型数据之间的无效操作
- ZeroDivisionError:除法运算中除数为 0 引发此异常
try except异常处理
Python 提供了try except语句捕获并处理异常,该异常处理语句的基本语法结构如下:
try:
可能产生异常的代码块
except [(Error1, Error2, ...) [as reason]]:
处理异常的代码块1
except [(Error3, Error4, ...) [as reason]]:
处理异常的代码块2
(Error1,Error2,…) 、(Error3,Error4,…) 表示各自的 except 块可以处理异常的具体类型;[as reason] 表示将异常类型赋值给变量 reason(方便在 except 块中调用异常类型)。
注意,except 后面也可以不指定具体的异常名称,这样的话,表示要捕获所有类型的异常。
try 块仅有一个,但 except 代码块可以有多个,这是为了针对不同的异常类型提供不同的异常处理方式
try-except处理的流程:
- 首先执行 try 中的代码块,如果执行过程中出现异常,系统会自动生成一个异常对象,该异常对象会提交给 Python解释器,此过程被称为引发异常。
- 当 Python 解释器收到异常对象时,会寻找能处理该异常对象的 except 块,如果找到合适的 except块,则把该异常对象交给该 except 块处理,这个过程被称为捕获异常。如果 Python 解释器找不到捕获异常的 except块,则程序运行终止,Python 解释器也将退出。
try:
f=open("ad.txt")
print(f.read())
f.close()
except IndexError as reason:
print(str(reason))
except OSError as reason:
print(str(reason))
#[Errno 2] No such file or directory: 'ad.txt'
多个异常也可做统一处理
注意try语句一旦出现异常,剩下语句将不被执行
try except else
try except 语句还有一个可选的else子句,如果使用这个子句,那么必须放在所有的except子句之后。这个子句将在try子句没有发生任何异常的时候执行。
try:
f=open("ad.txt",'w')
f.write("There is no error")
f.close()
except IndexError as reason:
print(str(reason))
except OSError as reason:
print(str(reason))
else:
print("没有错误")
#没有错误
try except finally
无论 try 中的语句是否跳入 except 中,最终都要进入 finally 语句,并执行其中的代码块。
在异常处理语法结构中,只有 try 块是必需的,也就是说:
- 如果没有 try 块,则不能有后面的 except 块和 finally 块;
- except 块和 finally 块都是可选的,但 except 块和 finally 块至少出现其中之一,也可以同时出现;
- 可以有多个 except 块,但捕获父类异常的 except 块应该位于捕获子类异常的 except 块的后面;
- 不能只有 try 块,既没有 except 块,也没有 finally 块;
- 多个 except 块必须位于 try 块之后,finally 块必须位于所有的 except 块之后
finally 语句块和 else 语句块的区别是,else 语句块只有在没有异常发生的情况下才会执行,而 finally 语句则不管异常是否发生都会执行。不仅如此,无论是正常退出、异常退出,还是通过 break、continue、return 语句退出,finally 语句块都会执行。
try:
f = open("ad.txt")
f.write("There is no error")
f.close()
except IndexError as reason:
print(str(reason))
except OSError as reason:
print(str(reason))
else:
print("没有错误")
finally:
print("运行结束")
#not writable
#运行结束
raise语句
Python 使用 raise 语句抛出一个指定的异常。
raise NameError()#NameError
raise NameError('HiThere')#NameError: HiThere