2010-05-05 4 views

Répondre

-2

Vérifiez la pile d'appels de l'exception.

Par exemple:

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

Ne faites pas cela; ExceptionContext fournit un moyen beaucoup plus simple, plus propre et efficace d'accéder au nom et à l'action du contrôleur, comme indiqué dans la réponse d'OdeToCode ci-dessous. –

+0

@ChristopherKing: Tant que vous avez ce contexte disponible. – SLaks

+4

Ce que je crois qu'il fait, selon l'affirmation qu'il gère les erreurs dans la méthode OnException. –

-4

Ajoutez la méthode suivante dans votre global.asax et de mettre un point d'arrêt sur ce

public void Application_Error(object sender, EventArgs e) 
    { 


    } 

Peu importe où dans l'application d'une erreur se produit, le point de rupture sur cette méthode sera frappé. De là, vous pouvez voir la valeur de l'expression suivante dans la fenêtre de la montre rapide et vous saurez ce qui était exactement la cause de l'exception qui a eu lieu

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

Cette méthode permettra, peu importe où l'exception se produit dans votre application Web.

+0

La question indique que le gestionnaire OnException du contrôleur est utilisé, ce qui ne répond pas à la question. –

48

Comme Charlino implicite, les valeurs sont disponibles à partir du paramètre ExceptionContext:

protected override void OnException(ExceptionContext filterContext) 
{ 
    var controllerName = filterContext.RouteData.Values["controller"]; 
    var actionName = filterContext.RouteData.Values["action"]; 

    // ... 

    base.OnException(filterContext); 
} 
Questions connexes