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