对错误代码进行异常处理
try: print(dict_01['address']) except KeyError as e: print(e) 复制代码
IndexError
list_01 = [1, 3, 4, 9, 10] list_01[10] 复制代码
try: list_01[10] except IndexError as e: print(e) 复制代码
ValueError
ValueError 常出现在数据类型转换时
name = 'stark' print(int(name)) 复制代码
try: print(int(name)) except ValueError as e: print(e) 复制代码
TypeError
def add(x, y): return x + y add() 复制代码
try: add() except TypeError as e: print(e) 复制代码
三、finally 关键字
finally 关键字:
- 无论是否发生异常,一定会执行代码块
- 在函数中,即使在try或者except中执行了return后也依然会执行finally代码块中的内容
- try语法至少要伴随except或者finally中的一个
def divid(x, y): try: x / y except Exception as e: print(e) finally: return 'divid()函数执行完毕' res = divid(1, 0) print(res) 复制代码
异常成功被捕获,并且执行了 finally 代码块中的内容,当 except 代码块中包含 return 时,finally 代码块依然会执行
def divid(x, y): try: x / y except Exception as e: return e finally: return 'divid()函数执行完毕' res = divid(1, 0) print(res) 复制代码
四、自定义异常
raise关键字
raise 关键字可以抛出自定义的异常信息
raise ValueError('这是自定义的异常信息') 复制代码
自定义异常
自定义异常类必须:
- 继承Exception基类
- 类构造函数中定义错误信息
def divid(x, y): if isinstance(x, str) or isinstance(y, str): raise Exception('参数类型不正确,不能为字符串') return x + y res = divid(1, 2) print(res) res_01 = divid('stark', 'tony') 复制代码
这里使用 raise 关键字输出错误信息,除此之外还可以自定义异常类来进行异常捕获
class NumberLimitError(Exception): def __init__(self, message): self.message = message def divid(x, y): if isinstance(x, str) or isinstance(y, str): raise NumberLimitError('参数类型不正确,参数只能为数字类型') return x + y try: res = divid('stark', 'tony') except NumberLimitError as e: print(e) 复制代码
自定义的异常能成功捕获异常信息。
五、断言
assert 可以对表达式进行判断,并输出指定的断言失败信息
assert expression, message 复制代码
- expression:表达式一般是判断是否相等,或者判断某种数据类型的bool判断的语句
- message:断言失败时的错误提示信息
dict_01 = { 'name': 'stark', 'age': 40 } assert len(dict_01) == 4, '断言失败, dict_01的长度不等于4' 复制代码
使用 try-except
进行异常处理
try: assert len(dict_01) == 4, '断言失败, dict_01的长度不等于4' except AssertionError as e: print(e) 复制代码
如果 assert 成功,则不会实处任何信息
try: assert len(dict_01) == 2, '断言失败, dict_01的长度不等于4' except AssertionError as e: print(e) 复制代码