如何找到发生错误的控制器/动作?

Posted

技术标签:

【中文标题】如何找到发生错误的控制器/动作?【英文标题】:How to find in which controller/action an error occurred? 【发布时间】:2011-02-15 18:02:33 【问题描述】:

我正在记录 OnException 方法中发生的所有错误。

【问题讨论】:

ExceptionContext不包含你想要的数据吗? 【参考方案1】:

正如 Charlino 所暗示的,这些值可从 ExceptionContext 参数中获得:

protected override void OnException(ExceptionContext filterContext)

    var controllerName = filterContext.RouteData.Values["controller"];
    var actionName = filterContext.RouteData.Values["action"];

    // ...

    base.OnException(filterContext);

【讨论】:

【参考方案2】:

检查异常的调用堆栈。

例如:

var actionMethod = new StackTrace(exception)
    .GetFrames().FirstOrDefault(f => 
        typeof(IController).IsAssignableFrom(f.GetMethod().DeclaringType)
    ).GetMethod();

【讨论】:

不要这样做;根据下面 OdeToCode 的回答,ExceptionContext 提供了一种更简单、更简洁、更有效的方式来访问控制器名称和操作。 @ChristopherKing:只要你有可用的上下文。 我相信他会这样做,根据他正在处理 OnException 方法中的错误的声明。 在这种特殊情况下(可用上下文),这可能不是最有效的方法,但它为接受的答案增加了一个价值,显示了另一种方法。我不会投赞成票,但我也不会投反对票。【参考方案3】:

在你的 global.asax 中添加以下方法并在其上放置一个断点

public void Application_Error(object sender, EventArgs e)
    


    

无论在应用程序的哪个位置发生错误,都会命中该方法的断点。从这里您可以在快速监视窗口中看到以下表达式的值,您将知道发生异常的确切原因是什么

((System.Web.HttpApplication)(sender)).Context.AllErrors

无论您的 Web 应用程序中发生异常的位置,此方法都会有所帮助。

【讨论】:

问题表明控制器的 OnException 处理程序正在被使用,所以这不是回答问题。 所以 Application_Error 也可以有两个参数!

以上是关于如何找到发生错误的控制器/动作?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 tableView 的滚动速度控制函数是不是发生

如何重定向到同一控制器中的另一个动作?

找不到“破坏”动作,但它在那里......奇怪的错误

如何使用 jQuery 调用 MVC ChildActionOnly 控制器动作

如何缩放 iOS 绘图应用程序?

oracle控制何时触发审计动作