MVC異常處理詳解
在日常開(kāi)發(fā)中,我們會(huì)去捕捉很多的異常,來(lái)進(jìn)行處理,通常我們的方法就是,在需要進(jìn)行異常處理的地方加上 try catch 塊,但是,如果需要異常處理的地方很多,那么,就會(huì)頻繁的去寫(xiě)try catch 塊,對(duì)于我們天生‘懶惰' 的程序員來(lái)說(shuō),總想找一個(gè)捷徑。于是,就會(huì)有全局異常處理,那么,今天,我們就來(lái)看看在MVC中怎么進(jìn)行全局異常處理的。
一、MVC框架自己的全局異常處理
在MVC中,框架已經(jīng)給我們一共了一套全局異常處理的特性類(lèi)HandleErrorAttribute類(lèi)。我們可以在MVC中的App_Start文件夾中的FilterConfig.cs文件中找到這么一行代碼
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
這個(gè)就是實(shí)例化一個(gè)HandleErrorAttribute類(lèi),放到過(guò)濾器中。然后我們的Views>Shared文件夾中有一個(gè)Error.cshtml的頁(yè)面,其中,該頁(yè)面里的Model的類(lèi)型為System.Web.Mvc.HandleErrorInfo,這個(gè)是MVC框架已經(jīng)給我寫(xiě)好了的,我們可以直接拿來(lái)用。
在Error.cshtml頁(yè)面中,我們可以做進(jìn)一步處理,來(lái)顯示錯(cuò)誤信息,根據(jù)需求來(lái)展示錯(cuò)誤信息。這些錯(cuò)誤信息都會(huì)在System.Web.Mvc.HandleErrorInfo類(lèi)中的某些屬性中找到的。
例如:一下是Error.cshtml。

我們?cè)贑ontrol中,故意寫(xiě)一個(gè)異常出來(lái):
public class HomeController : Controller
{
public ActionResult Index()
{
string i = "12a";
int j = Convert.ToInt32(i);
return View();
}
}
運(yùn)行一下,我們來(lái)看一下結(jié)果。

以上就是運(yùn)行的結(jié)果,我們可以看到,System.Web.Mvc.HandleErrorInfo類(lèi)還是有很多豐富的屬性的,我們可以直接拿來(lái)用。
MVC自帶的這套異常處理默認(rèn)的是處理錯(cuò)誤碼為500系列的異常,如果是404,就不會(huì)走這個(gè)了。不過(guò),我們可以通過(guò)Web.config文件的設(shè)置,來(lái)進(jìn)行處理??次覀?nèi)绾翁幚淼摹?/span>
首先,我們先將Error.cshtml頁(yè)補(bǔ)充完整,先給他加一個(gè)Control,然后,我們?cè)賹?xiě)一個(gè)專(zhuān)門(mén)處理404的View和Control。如下
namespace Exception.Controllers
{
public class SharedController : Controller
{
// GET: Shares
public ActionResult Error()
{
return View();
}
public ActionResult NotFondError()
{
return View();
}
}
}
頁(yè)面:

然后我們?cè)跒g覽器地址中寫(xiě)一個(gè)錯(cuò)誤的地址,看一下結(jié)果:

二、重寫(xiě)MVC中的異常處理
在開(kāi)發(fā)中,我們經(jīng)常有這么一個(gè)需求,我們需要將異常通過(guò)文本日志的方式記錄下來(lái)并保存,那么MVC自帶的異常處理方式System.Web.Mvc.HandleErrorInfo沒(méi)有這么一個(gè)功能,那么我們通過(guò)重寫(xiě)的方式來(lái)讓它有這個(gè)功能。下面,我們來(lái)看看如何重寫(xiě)。
首先我們建一個(gè)類(lèi),讓這個(gè)類(lèi)繼承System.Web.Mvc.HandleErrorInfo,然后重寫(xiě)System.Web.Mvc.HandleErrorInfo中的虛方法:OnException方法。
public class CustomHandleErrorAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
base.OnException(filterContext);
var err = filterContext.Exception.Message;//錯(cuò)誤內(nèi)容
//=============================
//將錯(cuò)誤記錄到日志中
//=============================
}
}
然后,將FilterConfig.cs加入:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new CustomHandleErrorAttribute());
}
}
這樣,我們就可以完成我們的需求了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- asp.net?core?MVC?全局過(guò)濾器之ExceptionFilter過(guò)濾器(1)
- Asp.net Mvc 身份驗(yàn)證、異常處理、權(quán)限驗(yàn)證(攔截器)實(shí)現(xiàn)代碼
- 詳解使用Spring MVC統(tǒng)一異常處理實(shí)戰(zhàn)
- springboot springmvc拋出全局異常的解決方法
- ASP.NET MVC異常處理模塊詳解
- ASP.NET MVC下基于異常處理的完整解決方案總結(jié)
- ASP.NET mvc異常處理的方法示例介紹
- 基于SpringMVC的全局異常處理器介紹
- ASP.NET MVC中異常處理&自定義錯(cuò)誤頁(yè)詳析
- ASP.NET MVC中異常Exception攔截的深入理解
相關(guān)文章
asp.net“服務(wù)器應(yīng)用程序不可用” 解決方法
服務(wù)器應(yīng)用程序不可用 您試圖在此 Web 服務(wù)器上訪問(wèn)的 Web 應(yīng)用程序當(dāng)前不可用。請(qǐng)點(diǎn)擊 Web 瀏覽器中的“刷新”按鈕重試您的請(qǐng)求。 管理員注意事項(xiàng): 詳述此特定請(qǐng)求失敗原因的錯(cuò)誤消息可在 Web 服務(wù)器的系統(tǒng)事件日志中找到。請(qǐng)檢查此日志項(xiàng)以查明導(dǎo)致該錯(cuò)誤發(fā)生的原因。2008-10-10
MVC 5限制所有HTTP請(qǐng)求必須是POST方式
這篇文章主要為大家詳細(xì)介紹了MVC 5限制所有HTTP請(qǐng)求必須是POST方式的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
*.ashx文件不能訪問(wèn)Session值的解決方法
這篇文章主要介紹了*.ashx文件不能訪問(wèn)Session值的解決方法,只需在頭部引用一個(gè)命名空間即可解決問(wèn)題,非常實(shí)用,需要的朋友可以參考下2014-09-09
HTTP協(xié)議下用Web Service上傳大文件的解決方案
HTTP協(xié)議下用Web Service上傳大文件的解決方案...2007-04-04
ASP.NET下備份與還原數(shù)據(jù)庫(kù)代碼
ASP.NET下備份還原數(shù)據(jù)庫(kù)的實(shí)現(xiàn)代碼,需要的朋友可以參考下。2010-03-03
ASP.net Substitution 頁(yè)面緩存而部分不緩存的實(shí)現(xiàn)方法
在ASP.NET中要實(shí)現(xiàn)部分內(nèi)容非緩存,而其它的都需要緩存輸出,可以使用Substitution控件實(shí)現(xiàn).2009-03-03
asp.net實(shí)現(xiàn)簡(jiǎn)單分頁(yè)實(shí)例
這篇文章主要介紹了asp.net實(shí)現(xiàn)簡(jiǎn)單分頁(yè)的方法,實(shí)例分析了asp.net分頁(yè)的基本原理與實(shí)現(xiàn)流程,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01

