问题来源:
在开发界面和逻辑部分分离开发的时候,为了让用户知道当前逻辑运行出错时,界面上友好提示用户,怎样操作去正常执行。这时候就需要要错误代码设计和所有逻辑API接口返回格式一致。在返回内容格式中,包含错误代码、错误名,错误描述以及数据。

现有技术分析:

Python的异常处理能力是很强大的,可向用户准确反馈出错信息。在Python中,异常也是对象,可对它进行操作。所有异常都是基类Exception的成员。所有异常都从基类Exception继承,而且都在exceptions模块中定义。Python自动将所有异常名称放在内建命名空间中,所以程序不必导入exceptions模块即可使用异常。一旦引发而且没有捕捉SystemExit异常,程序执行就会终止。如果交互式会话遇到一个未被捕捉的SystemExit异常,会话就会终止。

  1. try/except:捕捉由代码中的异常并恢复,匹配except里面的错误,并自行except中定义的代码,后继续执行程序(发生异常后,由except捕捉到异常后,不会中断程序,继续执行try语句后面的程序)
  2. try/finally: 无论异常是否发生,都执行清理行为 (发生异常时程序会中断程序,只不过会执行finally后的代码)
  3. raise: 手动在代码中接触发异常。
  4. 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())