通常状况下在python没法正常处理程序时就会发生一个异常。
异常是python对象,表示一个错误。当python程序发生错误时须要捕获处理,不然程序会终止执行。html
捕获异常可使用try/except
语句。
该语句用来检测try
语句块中的错误,从而让except
语句捕获异常信息并处理。python
语法规则json
1 2 3 4 5 6 7 8 9 10 |
try: <语句> #运行别的代码 except <名字>: <语句> #若是在try部份引起了'name'异常 except <名字>,<数据>: <语句> #若是引起了'name'异常,得到附加的数据 else: <语句> #若是没有异常发生 finally: <语句> #无论如何,最后必定执行的代码 |
处理流程
当开始一个try语句后,python会在当前程序的上下文中进行标记,这样当异常出现时就能够回到这里,try子句先执行,接下来发生什么依赖于执行时是否出现异常。后端
1 2 3 4 5 6 7 8 9 10 |
try: print("开始计算") result = 2/0 print("计算结果为:{0}".format(result)) except Exception as e: print("除数不能为0") else: print("无异常出现") finally: print("done") |
输出结果前后端分离
1 2 3 |
开始计算 除数不能为0 done |
根据输出结果能够看到,有异常出现的时候,先执行try
语句,遇到异常则中止执行下面的语句(print("计算结果为:{0}".format(result))
未执行),跳转至错误处理代码,也就是except
语句块,执行完except
后执行finally
语句块。不执行else
语句块。函数
1 2 3 4 5 6 7 8 9 10 |
try: print("开始计算") result = 2/1 print("计算结果为:{0}".format(result)) except Exception as e: print("除数不能为0") else: print("无异常出现") finally: print("done") |
输出结果spa
1 2 3 4 |
开始计算 计算结果为:2.0 无异常出现 done |
根据输出结果能够看到,无异常出现的时候前后执行了try
、else
和finally
语句块,未执行except
语句块。
在异常处理时else
和finally
语句块能够没有。code
1 2 3 4 5 6 7 8 9 10 11 |
try: print("开始计算") result = 2/0 print("计算结果为:{0}".format(result)) except Exception as e: print("除数不能为0") raise e #添加raise语句抛出错误 else: print("无异常出现") finally: print("done") |
输出结果orm
1 2 3 4 5 6 7 |
开始计算 除数不能为0 done Traceback (most recent call last): File "<stdin>", line 7, in <module> File "<stdin>", line 3, in <module> ZeroDivisionError: division by zero |
经过添加raise
抛出错误,咱们能够看到错误类型为ZeroDivisionError
。
在python中内置了不少的错误类型,咱们能够经过针对不一样的错误类型,可使用不一样的except
语句处理。htm
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
try: print("开始计算") result = 2/int('a') print("计算结果为:{0}".format(result)) except ZeroDivisionError as e: print("除数不能为0") raise e except ValueError as e: print("ValueError") raise e else: print("无异常出现") finally: print("done") |
输出结果
1 2 3 4 5 6 7 |
开始计算 ValueError done Traceback (most recent call last): File "<stdin>", line 10, in <module> File "<stdin>", line 3, in <module> ValueError: invalid literal for int() with base 10: 'a' |
此时执行try
语句块时,int()
函数抛出ValueError
异常,因此执行了第二个except
捕获对应异常信息。
前面咱们在except
中直接使用Exception
,因为大部分的错误类型都是继承自该类型,因此可直接捕获其子类。
python中全部的错误都是从BaseException
类派生的,点击查看常见的错误类型和继承关系。
在常见的先后端分离开发环境中,对于异常信息一般都是按照约定格式,返回json字符串,从而将异常信息记录下来。
下面是一个示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import json def 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}]} |