ASP.NET MVC中多catch子句为何无法捕获特定SqlException
多catch分支无法匹配预期SqlException的问题
我尝试在try-catch块中设置多个catch子句,根据Exception的具体类型,为不同类型的异常匹配专属处理逻辑。
我已经将更具体的异常类型(System.Data.SqlClient.SqlException)放在catch块的最上方,更通用的异常类型(Exception)放在最下方。但实际运行时,即便抛出的异常类型匹配System.Data.SqlClient.SqlException,最终执行的始终是最通用的Exception分支逻辑。
初始实现代码
[HttpPost] public ActionResult Create(Bank bank) { try { _context.Banks.Add(bank); _context.SaveChanges(); } catch(System.Data.SqlClient.SqlException e) { return View("Error", e); } catch(Exception e) { return View("Error", e); } return RedirectToAction("Index", "Banks"); }
我在移除try-catch块的情况下复现异常,从运行反馈来看,抛出的异常确实是System.Data.SqlClient.SqlException类型。
更新
后续排查中我发现了关键线索,我先移除通用的Exception catch块,运行如下代码:
public ActionResult Create(Bank bank) { try { _context.Banks.Add(bank); _context.SaveChanges(); } catch (System.Data.SqlClient.SqlException e) { return View("Error", e); } return RedirectToAction("Index", "Banks"); }
调试时弹出提示,显示实际抛出的异常类型是System.Data.Entity.Infrastructure.DbUpdateException。
由于catch的异常类型不匹配,异常直接向外抛出。但站点页面展示的异常详情却表明该异常是System.Data.SqlClient.SqlException类型,按理说我的catch块应该可以捕获这个异常,调试器和页面展示的异常类型存在明显差异。
我尝试修改代码,将catch块替换为调试器上报的异常类型,即使用catch (System.Data.Entity.Infrastructure.DbUpdateException e),从调试界面可以看到,现在catch块可以正常触发执行了。
目前我仍然不清楚为什么调试器和页面展示的异常类型不一致,也不明白为什么只有调试器上报的异常类型才能被catch块捕获。如果大家知道背后的原因欢迎告知,不过我最初提出的问题已经得到解决。
内容的提问来源于stack exchange,提问作者Daniel Kim
相关产品推荐
相关产品推荐

