簡體   English   中英

處理asp.net mvc控制器中的異常

[英]Handle exception in asp.net mvc controller

我創建了新屬性,在邏輯中我有一些例外我的問題是:我應該如何在控制器中處理它並將其傳遞給視圖? 在下面的代碼中我拋出異常,我該如何將其移動到視圖中?

這是控制器中的屬性

[HttpPost]
[CheckToken]
public JsonResult Edit(Roles role)
{
    ...
}

這是屬性

public class CheckToken : FilterAttribute, IAuthorizationFilter
{
    ....

    catch (HttpAntiForgeryException e)
    {
        throw new HttpAntiForgeryException("token not found");
    }
}

CLR Via C#一書中,有一個關於異常處理的建議:

不要抓住一切

由於沒有經過適當使用異常的適當培訓的開發人員所犯的無處不在的錯誤是過於頻繁和不正確地使用catchblock。 當你發現異常時,你會說你期望這個異常,你明白它為什么會發生,你知道如何處理它。

只有當我們知道如何從該異常中恢復應用程序狀態時,我們才應該捕獲異常。

在你的代碼中,你捕獲異常而不做任何事情,而不僅僅是重新拋出它。 這不是必需的。 請注意,當您重新拋出異常時,CLR會重置其異常的起始點。

catch (HttpAntiForgeryException e)
{
    throw new HttpAntiForgeryException("token not found"); // CLR thinks this is where exception originated.
}

在您的情況下,我不會處理異常並將其傳遞給視圖。 我將讓執行停止並在全局異常過濾器中處理它以使用正確的http狀態代碼向用戶返回錯誤 (例如:我們不應返回狀態為200的錯誤頁面)並且可以選擇將錯誤記錄到DB進一步分析。

有關如何實現全局異常過濾器的信息: http//forums.asp.net/t/1848242.aspx? How+to+implement+global+ error+handling+in+ASP+NET+Web+API

而不是拋出exception..u可以像:

catch (HttpAntiForgeryException e)
{
   filterContext.RouteData.Values.Add("Antiforgery", "token not found");
}

並在ur jsonresult中使用Routevalues:

[HttpPost]
[CheckToken]
public JsonResult GroupEdit(Roles role)
{
  ViewData["Message"] = RouteData.Values["Antiforgery"];
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM