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

如何处理ASP.NET MVC 5中Elmah自身引发的异常?

解决Elmah自身异常无法被捕获的问题

这个问题我之前也碰到过——你的try/catch之所以没起作用,核心原因是Elmah的ErrorSignal.FromCurrentContext().Raise()是异步非阻塞的:它会把异常投递到后台线程处理,不会在当前调用的线程中抛出任何异常,所以你的catch代码块永远不会执行。

要捕获Elmah自身的异常(比如数据库宕机、连接串错误),你需要改用Elmah同步的日志记录方式,直接调用错误日志提供程序的Log方法,这样就能在当前线程中捕获到异常了。

具体实现代码

try
{
    // 获取配置好的默认Elmah错误日志提供程序(也就是你的OracleErrorLog)
    var errorLog = Elmah.ErrorLog.GetDefault(HttpContext.Current);
    // 手动创建Error对象并同步执行日志记录
    errorLog.Log(new Elmah.Error(new Exception("Testing Elmah exception handling")));
}
catch (Exception ex)
{
    // 现在就能捕获到Elmah连接数据库失败等自身异常了
    LogException(ex);
}

为什么这个方法有效?

ErrorLog.GetDefault()会读取你Web.config中配置的Elmah日志提供程序(也就是你配置的Oracle版本),而Log方法是同步执行的:它会直接尝试写入数据库,如果遇到数据库不可用、连接串无效等问题,会立即在当前线程抛出异常,这样你的catch块就能捕获到,并调用自定义的LogException方法来记录。

额外注意事项

  • 确保HttpContext.Current在你调用这段代码的上下文里是可用的(比如MVC控制器、过滤器中都没问题;如果是后台任务,可能需要手动传入上下文或者配置Elmah的无上下文日志记录方式)。
  • 测试时,可以故意修改Oracle连接字符串为错误值,或者临时关闭数据库,验证是否能触发catch块中的逻辑。

内容的提问来源于stack exchange,提问作者underflow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:09:23