python异常处理
异常
一般情况下在python无法正常处理程序时就会发生一个异常。
异常是python对象,表示一个错误。当python程序发生错误时需要捕获处理,否则程序会终止执行。异常处理
捕获异常可以使用try/except
语句。
try
语句块中的错误,从而让except
语句捕获异常信息并处理。 -
语法规则
12345678910
try: <语句> #运行别的代码except <名字> : <语句> #如果在try部份引发了'name'异常except <名字> , <数据> : <语句> #如果引发了'name'异常,获得附加的数据else: <语句> #如果没有异常发生finally: <语句> #不管如何,最后一定执行的代码 语句> 语句> 语句> 数据> 名字> 语句> 名字> 语句>
-
处理流程
当开始一个try语句后,python会在当前程序的上下文中进行标记,这样当异常出现时就可以回到这里,try子句先执行,接下来发生什么依赖于执行时是否出现异常。
- 当try后面的语句执行出现异常,python就会调回try并执行第一个匹配该异常的except子句,异常处理完成,然后控制流通过整个try语句。
- 当try后面的语句执行出现异常,却没有匹配的except子句,异常将会被递交到上层的try,或者到程序的最上层(也就是结束程序,并打印出缺省的出错信息)。
- 当try子句执行没有异常,python将执行else后面的语句,然后控制流通过整个try语句。
实例
- 有异常出现被捕获的情况
12345678910
try: print("开始计算") result = 2/0 print("计算结果为:{0}".format(result))except Exception as e: print("除数不能为0")else: print("无异常出现")finally: print("done")
输出结果
123 | 开始计算除数不能为0done |
根据输出结果可以看到,有异常出现的时候,先执行try
语句,遇到异常则停止执行下面的语句(print("计算结果为:{0}".format(result))
未执行),跳转至错误处理代码,也就是except
语句块,执行完except
后执行finally
语句块。不执行else
语句块。
- 无异常出现情况
12345678910
try: print("开始计算") result = 2/1 print("计算结果为:{0}".format(result))except Exception as e: print("除数不能为0")else: print("无异常出现")finally: print("done")
输出结果
1234 | 开始计算计算结果为:2.0无异常出现done |
根据输出结果可以看到,无异常出现的时候先后执行了try
、else
和finally
语句块,未执行except
语句块。
else
和finally
语句块可以没有。 - raise抛出错误
1234567891011
try: print("开始计算") result = 2/0 print("计算结果为:{0}".format(result))except Exception as e: print("除数不能为0") raise e #添加raise语句抛出错误else: print("无异常出现")finally: print("done")
输出结果
1234567 | 开始计算除数不能为0doneTraceback (most recent call last): File " |
通过添加raise
抛出错误,我们可以看到错误类型为ZeroDivisionError
。
except
语句处理。 1234567891011121314 | try: print("开始计算") result = 2/int('a') print("计算结果为:{0}".format(result))except ZeroDivisionError as e: print("除数不能为0") raise eexcept ValueError as e: print("ValueError") raise eelse: print("无异常出现")finally: print("done") |
输出结果
1234567 | 开始计算ValueErrordoneTraceback (most recent call last): File " |
此时执行try
语句块时,int()
函数抛出ValueError
异常,所以执行了第二个except
捕获对应异常信息。
except
中直接使用Exception
,由于大部分的错误类型都是继承自该类型,所以可直接捕获其子类。 python中所有的错误都是从BaseException
类派生的,点击查看。 异常信息规范输出
在常见的前后端分离开发环境中,对于异常信息通常都是按照约定格式,返回json字符串,从而将异常信息记录下来。
下面是一个示例 123456789101112131415 | import jsondef log(): result = {} try: print(2/0) except Exception as e: result["msg"] = "Division can not be 0" result["code"] = 250 result["data"] = [{"a": 1}, {"b": 2}] finally: return json.dumps(result) #字典转换为json串if __name__ == '__main__': print(log()) |
输出结果
1 | {"msg": "Division can not be 0", "code": 250, "data": [{"a": 1}, {"b": 2}]} |