You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.28 00:15:03