最近刚开始进行工程对接,我们是提供基础服务的一方,除了约定接口给下一步提供服务的团队,在工程对接过程中,频繁感受到了对接团队对异常处理的要求。
我们是python提供服务,他们是C#调用我们的服务,除了接口问题,他们还需要了解我们服务的执行状态,是正常执行结束,还是遇到异常,代码退出或死掉,他们那边要针对状态来提供下一步的服务,或针对问题重启服务,或哪里有问题进行提示修改,以使服务正常运行。
由于我们之前的代码是经过测试完全符合一套运行流程的,只要按照对应要求执行就可以正常执行完毕并获得结果,所以提供的数据或参数标准是我们确定的,但是做工程的话需要解决用户的各种问题,防止用户输入出错,导致代码不能正常执行。
所以根据下一步服务对接的要求,我们把一些我们不会犯的错做了一个预防措施,即对代码增加了异常处理并及时返回状态码给外层调用程序,以监控代码的执行。
1、对于异常处理,其实大家也很熟悉,就是常见的try…except…
下面是查找的资料:
try:
可能产生异常的代码块
except [ (Error1, Error2, ... ) [as e] ]:
处理异常的代码块1
except [ (Error3, Error4, ... ) [as e] ]:
处理异常的代码块2
except [Exception]:
处理其它异常
个人用法:
try:
"可能出问题的函数xxx = xx()"
except:
"#知道产生的具体错误可直接限定,如 except (ValueError, ArithmeticError):"
pass
"或者其他处理方式以使代码正常往下执行"
查找的示例:
try:
xxxxxx
except Exception as e:
# 访问异常的错误编号和详细信息
print(e.args)
print(str(e))
print(repr(e))
2、返回代码执行的状态码
import sys
try:
"要执行的代码xxx"
print("xxx功能执行完毕")"或者打印代码执行成功提示,但是打印不提供执行状态"
except:
"如果执行异常则进入except"
sys.exit(-1)"返回-1说明代码执行异常,-1会返回给外层代码,代码执行终止"
print("xxx执行异常退出提示")
sys.exit(0)"代码正常执行完毕返回0,0会返回给外层调用程序获取其执行状态,可添加在某大块功能调用结束后,"
"不需要在细节函数添加,会给外层代码造成干扰"
关于状态码的说明:返回的数值(0,-1,xxx等等)作为状态码可被外层程序捕获。
sys.exit()的退出比较好用,调用后会引发SystemExit异常,可以捕获此异常做清理工作
exit(0)"0表示代码正常执行结束退出,其他数值(1-127)为不正常,可抛异常事件供捕获"
exit(-1)"-1表示代码执行异常退出"
"也可以是返回具体错误进行显示"
sys.exit('xxx执行错误,请检查!!!')
还有一个退出方式os._exit(),会直接终止python代码的执行,主要用于线程中出错终止,sys.exit()主要用于主进程终止
"仿照sys.exit()进行理解"
import os
try:
os._exit(0)
except:
print('code die')
一般情况下使用sys.exit()即可,一般在fork出来的子进程中使用os._exit()