一、初识异常
异常与异常处理:
- 异常既错误
- 异常会导致程序崩溃并停止运行
- 异常处理可以捕获到异常,将异常部位的程序进行处理使得程序继续正常运行
异常处理的结构由 try-except
代码块组成
try: 代码块 #被try关键字检查并保护的代码 except <异常类型> # try关键字检查的代码可能出现的异常的种类 代码块 # try关键字检查的代码出现异常后执行的代码 复制代码
def upper(str_data): new_str = str_data.upper() return new_str res = upper('hero') print(res) 复制代码
调用 upper 函数时,传入字符串,函数可以正常执行,如果传入数字则会报错
res_01 = upper(111) print(res_01) res_02 = upper('hello') print(res_02) 复制代码
错误代码后面的代码无论正确与否一旦出现异常,程序就会终止,这个时候就需要对这段可能会出错的代码进行异常处理,确保程序能正常运行。
def upper(str_data): new_str = '' try: new_str = str_data.upper() except: print('程序执行出现问题') return new_str 复制代码
对函数中可能出现异常的代码进行了异常处理,程序可以正常执行。
捕获异常
可以对try-except代码中的异常进行捕获,再不确定是那种异常的情况下可以使用异常的基类Exception进行捕获
def divid(x, y): res = 0 try: res = x / y except Exception as e: print(e) return res res = divid(1, 2) print(res) res_01 = divid(1, 0) print(res_01) res_02 = divid(10, 2) print(res_02) 复制代码
不使用try-except异常处理,执行函数,查看控制台打印出的具体异常
def divid(x, y): res = x / y return res 复制代码
可以看出控制塔打印的异常为 “ZeroDivisionError: division by zero”,如果可以确定具体的异常类型,也可以在except关键字后捕获具体的异常
def divid(x, y): res = 0 try: res = x / y except ZeroDivisionError as e: print(e) return res 复制代码
在对列表和字符串进行索引操作时还会出现索引超出范围异常,使用这个异常看能否不会divid函数中的异常
def divid(x, y): res = 0 try: res = x / y except IndexError as e: print(e) return res 复制代码
程序运行还是出错,这是因为异常类型不匹配,所以没有捕获到,在进行异常处理时如果可以确定具体的异常类型就使用具体的异常类型,如果不确定就是用基类异常,使用的异常不匹配程序仍然不能正确执行
捕获多个异常
可以通过连续添加except代码块的方式捕获多个异常。
try: # 代码块 except Eexception1 as e1: # 代码块 except EXception2 as e2: # 代码块 except EXception3 as e3: # 代码块 复制代码
当 except 代码块有多个的时候,当异常类型匹配后,就不会继续往下捕获,也可以使用元组将所有待捕获的异常存起来。
try: # 代码块 except (Eexception1, Exception2, Exception3) as e: # 代码块 复制代码
def divid(x, y): res = 0 try: res = x / y except (IndexError, NameError, ZeroDivisionError) as e: print(e) return res 复制代码
或者
def divid(x, y): res = 0 try: res = x / y except IndexError as e: print(e) except NameError as e2: print(e2) except ZeroDivisionError as e3: print(e3) return res 复制代码
二、常见异常类型
异常类型名称 | 异常类型描述 |
Exception | 通用异常类型(基类) |
ZeroDivisionError | 整除0时出现的异常 |
AttributeError | 对象不含指定属性时出现的异常 |
IOError | IO流输入输出时出现的异常 |
KeyError | 没有指定的键时出现的异常 |
NameError | 指定变量不存在时出现的异常 |
SyntaxError | Python语法错误出现的异常 |
SystemError | 系统错误出现的异常 |
ValueError | 参数值异常 |
AttributeError
class Student: name = None age = 7 def __init__(self, name, age): self.name = name self.age = age def __str__(self): return 'Student[name={}, age={}]'.format(self.name, self.age) stu = Student("stark", 44) print(stu) print(stu.address) 复制代码
该异常类型为 AttributeError,既stu对象没有address属性,通过try-except对异常进行处理
try: stu = Student("stark", 44) print(stu) print(stu.address) except AttributeError as e: print(e) 复制代码
KeyError
dict_01 = { 'name': 'stark', 'age': 44 } print(dict_01['address']) 复制代码