網(wǎng)站首頁 編程語言 正文
我們平常在程序里面為了捕獲異常,會加上try-catch-finally代碼,但是這樣會使得程序代碼看起來很龐大,在MVC中我們可以使用異常過濾器來捕獲程序中的異常,如下圖所示:
使用了異常過濾器以后,我們就不需要在Action方法里面寫Try -Catch-Finally這樣的異常處理代碼了,而把這份工作交給HandleError去做,這個特性同樣可以應(yīng)用到Controller上面,也可以應(yīng)用到Action方面上面。
注意:
使用異常過濾器的時候,customErrors配置節(jié)屬性mode的值,必須為On。
演示示例:
1、Error控制器代碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Data.SqlClient; using System.IO; namespace _3_異常過濾器.Controllers { public class ErrorController : Controller { // GET: Error [HandleError(ExceptionType =typeof(ArithmeticException),View ="Error")] public ActionResult Index(int a,int b) { int c = a / b; ViewData["Result"] = c; return View(); } ////// 測試數(shù)據(jù)庫異常 /// ///[HandleError(ExceptionType = typeof(SqlException), View = "Error")] public ActionResult DbError() { // 錯誤的連接字符串 SqlConnection conn = new SqlConnection(@"Initial Catalog=StudentSystem; Integrated Security=False;User Id=sa;Password=******;Data Source=127.0.0.1"); conn.Open(); // 返回Index視圖 return View("Index"); } /// /// IO異常 /// ///[HandleError(ExceptionType = typeof(IOException), View = "Error")] public ActionResult IOError() { // 訪問一個不存在的文件 System.IO.File.Open(@"D:\error.txt",System.IO.FileMode.Open); // 返回Index視圖 return View("Index"); } } }
2、路由配置如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; namespace _3_異常過濾器 { public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); // 新增路由配置 routes.MapRoute( name: "Default2", url: "{controller}/{action}/{a}/{b}", defaults: new { controller = "Home", action = "Index", a=0,b=0 } ); } } }
3、配置文件如下:
4、運行結(jié)果
URL:http://localhost:21868/error/index/8/4
結(jié)果:
URL:http://localhost:21868/error/index/8/0
結(jié)果:
URL:http://localhost:21868/error/DbError
結(jié)果:
URL:http://localhost:21868/error/IOError
結(jié)果:
在同一個控制器或Action方法上可以通過HandleError處理多個異常,通過Order屬性決定捕獲的先后順序,但最上面的異常必須是下面異常的同類級別或子類。如下圖所示:
上面的程序可以修改成如下的代碼:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Data.SqlClient; using System.IO; namespace _3_異常過濾器.Controllers { [HandleError(Order =1, ExceptionType = typeof(SqlException), View = "Error")] [HandleError(Order =2, ExceptionType = typeof(IOException), View = "Error")] [HandleError(Order =3)] //不指定View,默認跳轉(zhuǎn)到Share下面的Error視圖 public class ErrorController : Controller { public ActionResult Index(int a,int b) { int c = a / b; ViewData["Result"] = c; return View(); } ////// 測試數(shù)據(jù)庫異常 /// ///public ActionResult DbError() { // 錯誤的連接字符串 SqlConnection conn = new SqlConnection(@"Initial Catalog=StudentSystem; Integrated Security=False;User Id=sa;Password=******;Data Source=127.0.0.1"); conn.Open(); // 返回Index視圖 return View("Index"); } /// /// IO異常 /// ///public ActionResult IOError() { // 訪問一個不存在的文件 System.IO.File.Open(@"D:\error.txt",System.IO.FileMode.Open); // 返回Index視圖 return View("Index"); } } }
在上面的示例中,捕獲異常的時候只是跳轉(zhuǎn)到了Error視圖,如果我們想獲取異常的具體信息該怎么辦呢?如下圖所示:
查看MVC源碼,可以發(fā)現(xiàn)HandleError返回的是HandleErrorInfo類型的model,利用該model可以獲取異常的具體信息,修改Error視圖頁面如下:
結(jié)果:
原文鏈接:https://www.cnblogs.com/dotnet261010/p/9005952.html
相關(guān)推薦
- 2022-06-24 C#中緩存System.Web.Caching用法總結(jié)_C#教程
- 2022-12-25 React不使用requestIdleCallback實現(xiàn)調(diào)度原理解析_React
- 2022-09-04 Python可視化tkinter詳解_python
- 2022-02-20 給定一個數(shù)組,讓數(shù)組的每一項都乘以2幾種實現(xiàn)方法
- 2023-05-19 Kotlin?this關(guān)鍵字的使用實例詳解_Android
- 2022-05-10 fatal: Not a git repository (or any of the parent
- 2022-01-27 關(guān)于httpclient中多次執(zhí)行execute阻塞問題,卡住不動了解決方式。
- 2022-05-25 Properties與ResourceBundle的基本使用以及區(qū)別
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支