python异常
一. 异常
异常是python解释器检测到程序的错误时,停止执行并给出错误信息
f = open("t.txt", "r") print("后面代码执行,程序正常终止") ''' Traceback (most recent call last): File C:\\Users\\11265\Desktop\\code\\venv\\class\\__init__.py, line 1, in <module> f = open("t.txt", "r") FileNotFoundError: [Errno 2] No such file or directory: "t.txt" '''
说明:只读模式打开一个不存在的文件,抛出异常,程序停止
二. 捕获异常和处理:
1. 在程序可能抛异常的地方使用try...except...捕获并处理异常
语法:
try: 可能发生错误的代码 except: 如果出现异常执行的代码
示例:
try: f = open("t.txt", "r") except: print("处理异常") print("后面代码执行,程序正常终止") ''' 处理异常 后面代码执行,程序正常终止 '''
说明:这里捕获的是所有异常
2. 捕获指定异常
可以在except 关键字后面添加异常类名,捕获指定异常
语法:
try: 可能发生错误的代码 except 异常类型: 如果捕获到该异常类型执行的代码
示例:
try: f = open("t.txt", "r") except FileNotFoundError: print("处理异常") print("后面代码执行,程序正常终止") ''' 处理异常 后面代码执行,程序正常终止 '''
说明:如果try后面语句块没有抛出FileNotFoundError,而是抛出其他异常,则异常不会被捕获
3. 捕获多个指定异常
except后面使用小括号,并用逗号隔开多个异常(实际为元组)
语法:
try: 可能发生错误的代码 except (异常1, 异常2...): 如果捕获到该异常类型执行的代码
示例:
try: f = open("t.txt", "r") except (FileNotFoundError, NameError): print("处理异常") print("后面代码执行,程序正常终止") ''' 处理异常 后面代码执行,程序正常终止 '''
4. 可以使用as关键字获取到捕获的异常对象并命名
语法:
try: 可能发生错误的代码 except (异常1, 异常2...) as 异常对象名: 如果捕获到该异常类型执行的代码
示例:
try: f = open("t.txt", "r") except (FileNotFoundError, NameError) as e: print(type(e)) # <class 'FileNotFoundError'> print("处理异常", e) # 处理异常 [Errno 2] No such file or directory: 't.txt'
5. Exception类捕获所有异常
try: f = open("t.txt", "r") except Exception as e: print(type(e)) # <class 'FileNotFoundError'> print("处理异常", e) # 处理异常 [Errno 2] No such file or directory: 't.txt'
说明:捕获的还是FileNotFoundError, 这是多态的一种表现
6. else
try语句块中如果没有出现异常,会执行else语句块,否则不执行
try: f = open("t.txt", "r") except Exception as e: print(type(e)) # <class 'FileNotFoundError'> print("处理异常", e) # 处理异常 [Errno 2] No such file or directory: 't.txt' else: print("try语句块中没有异常时执行的代码") # 未执行
7. finally:无论是否有异常,均会执行的代码
try: f = open("t.txt", "r") except NameError as e: print(type(e)) # <class 'FileNotFoundError'> print("处理异常", e) # 处理异常 [Errno 2] No such file or directory: 't.txt' else: print("try语句块中没有异常时执行的代码") # 未执行 finally: print("无论无何都会执行的代码")
说明:finally代码块无论如何都会执行,即使except 未捕获到抛出的异常也会执行
8. 异常传递
内存未处理的异常抛出后,在外层可以捕获到
9. 程序中主动抛出异常:
语法:
raise 异常类名(参数)
说明raise后面的语句其实就是创建了一个异常类对象
示例:
try: raise NameError() f = open("t.txt", "r") except NameError as e: print(type(e)) # <class 'NameError'> print("处理异常", e) # 处理异常
说明:try语句块中一旦抛出异常,这个语句块中后面的代码不再执行,直接执行except语句
10. 自定义异常
创建一个类并继承Exception,即创建了一个自定义异常类
class MyError(Exception): def __init__(self): self.name = '自定义异常' def __str__(self): return self.name try: raise MyError() except MyError as e: print(type(e)) # <class '__main__.MyError'> print("处理异常", e) # 处理异常 自定义异常