入門系列 異常處理

2021-10-03 17:15:50 字數 4723 閱讀 3074

abp提供了用於處理web應用程式異常的標準模型.

當滿足下面任意乙個條件時,abpexceptionfilter會處理此異常:

如果異常被處理過,則會自動記錄日誌並將格式化的json訊息返回給客戶端.

每個錯誤訊息都是remoteserviceerrorresponse類的例項.最簡單的錯誤json只有乙個message屬性,如下所示:

}

其它可選字段可以根據已發生的異常來填充.

錯誤**(code)是異常資訊中乙個有唯一值並可選的字串值.丟擲的異常應實現ihaserrorcode介面來填充該欄位.示例json如下:

}

錯誤**同樣可用於異常資訊的本地化及自定義http狀態**(請參閱下面的相關部分).

錯誤的詳細資訊(details)是可選屬性.丟擲的異常應實現ihaserrordetails介面來填充該欄位.示例json如下:

}

當丟擲的異常實現ihasvalidationerrors介面時,validationerrors是乙個可被填充的標準欄位.示例json如下:

,

]}}

abpvalidationexception已經實現了ihasvalidationerrors介面,當請求輸入無效時,框架會自動丟擲此錯誤. 因此,除非你有自定義的驗證邏輯,否則不需要處理驗證錯誤.

**獲的異常會被自動記錄到日誌中.

預設情況下,記錄異常級別為error.可以通過實現ihasloglevel介面來指定日誌的級別,例如:

public class myexception : exception, ihasloglevel

= loglevel.warning;

//...

}

某些異常型別可能需要記錄額外日誌資訊.可以通過實現iexceptionwithselflogging介面來記錄指定日誌,例如:

public class myexception : exception, iexceptionwithselflogging

}

擴充套件方法ilogger.logexception用來記錄異常日誌. 在需要時可以使用相同的擴充套件方法.

大多數異常都是業務異常.可以通過使用ibusines***ception介面來標記異常為業務異常.

busines***ception除了實現ihaserrorcode,ihaserrordetails,ihasloglevel介面外,還實現了ibusines***ception介面.其預設日誌級別為warning.

通常你會將乙個錯誤**關聯至特定的業務異常.例如:

throw new busines***ception(qaerrorcodes.cannotvoteyourownanswer);
qaerrorcodes.cannotvoteyourownanswer是乙個字串常量. 建議使用下面的錯誤**格式:

:
code-namespace,應在指定的模組/應用層中保證其唯一.例如:

volo.qa:010002
volo.qa在這是作為code-namespace.code-namespace同樣可以在本地化異常資訊時使用.

這裡有個問題,就是如何在傳送錯誤訊息到客戶端時,對錯誤訊息進行本地化.abp提供了2個模型.

如果異常實現了iuserfriendlyexception介面,那麼abp不會修改messagedetails屬性,而直接將它傳送給客戶端.

userfriendlyexception類是內建的iuserfriendlyexception介面的實現,示例如下:

throw new userfriendlyexception(

"username should be unique!"

);

採用這種方式是不需要本地化的.如果需要本地化訊息,則可以注入string localizer( 請參閱本地化文件 )來實現. 例:

throw new userfriendlyexception(_stringlocalizer["usernameshouldbeuniquemessage"]);
再在本地化資源中為每種語言新增對應的定義.例如:

}

string localizer支援引數化資訊,例如:

throw new userfriendlyexception(_stringlocalizer["usernameshouldbeuniquemessage", "john"]);
其本地化文字如下:

"usernameshouldbeuniquemessage": "username should be unique! '' is already taken!"
iuserfriendlyexception介面派生自ibusines***ception,而userfriendlyexception類派生自busines***ception類。

userfriendlyexception很好用,但是在一些高階用法裡面,它存在以下問題:

那麼這時就可以通過使用錯誤**的方式來處理本地化,而不是在丟擲異常的時候.

首先,在模組配置**中將code-namespace對映至本地化資源:

services.configure(options =>

);

然後volo.qa命名空間下的所有異常都將被對應的本地化資源進行本地化處理. 本地化資源中應包含對應錯誤**的文字. 例如:

}

最後就可以丟擲乙個包含錯誤**的業務異常了:

throw new busines***ception(qadomainerrorcodes.cannotvoteyourownanswer);
如果有引數化的錯誤訊息,則可以使用異常的data屬性進行設定.例如:

}};

另外有一種更為快捷的方式:

.withdata("username", "john");

下面就是乙個包含username引數的錯誤訊息:

}

abp嘗試按照以下規則,自動對映常見的異常型別的http狀態**:

對於abpvalidationexception返回400(錯誤的請求) .

對於entitynotfoundexception返回404(未找到).

對於ibusines***ceptioniuserfriendlyexception(它是ibusines***ception的擴充套件) 返回403(未授權) .

對於notimplementedexception返回501(未實現) .

對於其他異常 (基礎架構中未定義的) 返回500(伺服器內部錯誤) .

ihttpexceptionstatuscodefinder是用來自動判斷http狀態**.預設的實現是defaulthttpexceptionstatuscodefinder.可以根據需要對其進行更換或擴充套件.

可以重寫http狀態**的自動對映,示例如下:

services.configure(options =>

);

框架會自動丟擲以下異常型別:

你同樣可以在**中丟擲這些型別的異常(雖然很少需要這樣做)

捕捉異常 python入門系列 異常處理

捕捉異常,然後再處理 try 可能出現異常的 有異常就會丟擲,不會再執行剩下的 try後面的 except error as 出現異常後,而且 捉到的 except可以寫多個,用來捕捉多個不同的異常else 異常未 捉到所執行的 可以省略 finally 不管有沒有異常都會執行的 異常的合併解決 t...

Python入門 異常處理

第二部分 異常的處理 2.2 try except else 2.3 try except finally s 1.3 n int s int 只能傳入整型,此處傳入了浮點型ls 1 2,3 ls 5 1 3 只能是字串與字串相加 或者數字與數字相加,不能混用x 10y 0try z x y exc...

異常處理彙總 移動系列

異常處理彙總 1.沒有hyper v服務,wp emulator無法啟動 2.無法啟動wp emulator 3.模擬器沒法確定來賓虛擬機器通訊的主機id位址。某些功能已被禁用 4.typeloadexception 找不到 windows 執行時型別 windows.ui.xaml.control...