1. 程式人生 > >python 錯誤程式碼和異常系統設計

python 錯誤程式碼和異常系統設計

問題來源:
在開發介面和邏輯部分分離開發的時候,為了讓使用者知道當前邏輯執行出錯時,介面上友好提示使用者,怎樣操作去正常執行。這時候就需要要錯誤程式碼設計和所有邏輯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())