问题来源:
在开发界面和逻辑部分分离开发的时候,为了让用户知道当前逻辑运行出错时,界面上友好提示用户,怎样操作去正常执行。这时候就需要要错误代码设计和所有逻辑API接口返回格式一致。在返回内容格式中,包含错误代码、错误名,错误描述以及数据。
现有技术分析:
Python的异常处理能力是很强大的,可向用户准确反馈出错信息。在Python中,异常也是对象,可对它进行操作。所有异常都是基类Exception的成员。所有异常都从基类Exception继承,而且都在exceptions模块中定义。Python自动将所有异常名称放在内建命名空间中,所以程序不必导入exceptions模块即可使用异常。一旦引发而且没有捕捉SystemExit异常,程序执行就会终止。如果交互式会话遇到一个未被捕捉的SystemExit异常,会话就会终止。
- try/except:捕捉由代码中的异常并恢复,匹配except里面的错误,并自行except中定义的代码,后继续执行程序(发生异常后,由except捕捉到异常后,不会中断程序,继续执行try语句后面的程序)
- try/finally: 无论异常是否发生,都执行清理行为 (发生异常时程序会中断程序,只不过会执行finally后的代码)
- raise: 手动在代码中接触发异常。
- assert: 有条件地在程序代码中触发异常。
解决方案:
用raise语句手工引发一个异常: 自定义异常
raise [exception[,data]]
在Python中,要想引发异常,最简单的形式就是输入关键字raise,后跟要引发的异常的名称。异常名称标识出具体的类:Python异常是那些类的对象。执行raise语句时,Python会创建指定的异常类的一个对象。raise语句还可指定对异常对象进行初始化的参数。为此,请在异常类的名称后添加一个逗号以及指定的参数(或者由参数构成的一个元组)。
例:
try:
raise MyError #自己抛出一个异常
except MyError:
print 'a error'
通过把警告和错误抛出异常,这样在给UI提示是,通过逻辑API返回的数据结构,可以清楚知道逻辑部分运行过程实时的问题,并能提高用户体验。
错误代码,可以采用几位数表示,组合表示,只要能区分错误或警告问题
直接上代码
#coding = utf-8
#author = ao.deng
class Result:
def __init__(self):
self.name = ''
self.code = ''
self.description = ''
self.data ={}
def setData(self,*args):
self.data=args
def getData(self):
return self.data
class RuntimeException(Exception):
'''''A user-defined exception class.'''
def __init__(self, name, code,description):
Exception.__init__(self)
self.name = name
self.code = code
self.description = description
class Test:
def printD(self,i):
if i > 2:
raise RuntimeException("数据太大", '1100',"i>3")
def printDD(self,i):
a = [0]
i += 1
print(a[i])
def printDDD(self,i):
a= [0,1]
i+=1
if i ==1:
raise RuntimeException("假设需要警告", '1101', "a[%d]" % i) #它会抛给最近except去捕获
return
try:
print(a[i])
except Exception as x:
raise RuntimeException("越界", '1001',"a[%d]"%i)
def printDDDD(self,i):
a= [0,1]
i+=1
try:
if i > 1:
raise RuntimeException("警告", '1101', "a[%d]" % i) #它会抛给最近except去捕获
return
print(a[i])
except Exception as x:
raise RuntimeException("越界", '1001',"a[%d]"%i)
def test(self):
mResultList=[]
for i in range(5):
try:
# self.printD(i)
# self.printDD(i)
self.printDDD(i)
except RuntimeException as x:
mResult = Result()
mResult.name = x.name
mResult.code = x.code
mResult.description = x.description
mResult.setData({})
mResultList.append(mResult)
if x.code[1]=='1':
print("警告 继续")
continue
else:
return mResultList
except Exception as e:
mResult = Result()
mResult.name = "Error"
mResult.code = "1001"
mResult.description = str(e)
mResult.setData({})
mResultList.append(mResult)
return mResultList
mResult = Result()
mResult.name = "Ok"
mResult.code = "1000"
mResult.description = "运行正确"
mResult.setData([1, 3, 5], {2: 3}, 4, 5, i)
mResultList.append(mResult)
return mResultList
if __name__=="__main__":
mTest =Test()
xxList=mTest.test()
for xx in xxList:
print(xx.code)
if xx.code[1]=='1':
print("警告")
elif xx.code== "1001":
print("错误")
else:
print("正确")
print(xx.name)
print(xx.description)
print(xx.getData())