2017-07-13 184 views
1

我已经在网上搜索并拼接了一个不起作用的错误处理解决方案,主要是因为我不完全理解异常管道是如何工作的。我使用了不同的指南,但我没有得到任何主题为我工作。我想要的错误处理程序是这样做的。我有一个名为workplanRepo的类,其中执行了所有的查询。我已经用try和catch块覆盖了所有查询。我想要的是,当发生错误时是抛出异常,允许我为每个查询和默认异常消息自定义特定消息。然后,我希望能够在异常处理程序将用户重定向到的错误视图中检索消息。我还想要一个捕获所有其他错误的默认处理程序。但不一定具有自定义消息部分。如果有人能够解释或展示我如何实现这一目标。我会很感激!。这是的查询方法:自定义错误处理程序

try { 
    newItem["Author"] = _user.Id; 
    newItem["Title"] = _user.Title; 

    newItem.Update(); 
    clientContext.ExecuteQuery(); 
    } 
    catch (Exception e) { 
     throw new HttpException("Oops, there must have been an error: " + e.Message); 
    } 
+0

看看这篇文章https://www.codeproject.com/Articles/850062/Exception-handling-in-ASP-NET-MVC-methods-explaine#ExceptionhandlinginASP.NETMVC(6methodsexplained) – Nkosi

+0

这也影响了我的答案在这里https://stackoverflow.com/questions/38247900/custom-error-pages-with-layout/38249656#38249656 – Nkosi

回答

3

在ASP.NET MVC 5,我们可以捕捉错误的Global.asax.cs的Application_Error事件内部而不是每个查询使用try catch块。然后从重定向到自定义错误页面。

此外,我们还可以利用日志框架一样log4net的NLOG

例如,

protected void Application_Error(object sender, EventArgs e) 
    { 
     var exception = Server.GetLastError(); 

     LogException(exception); 

     if (exception is HttpAntiForgeryException) 
     { 
      Response.Clear(); 
      Server.ClearError(); 
      Response.TrySkipIisCustomErrors = true; 

      // Call target Controller and pass the routeData. 
      IController controller = EngineContext.Current.Locator.GetInstance<CommonController>(); 

      var routeData = new RouteData(); 
      routeData.Values.Add("controller", "Common"); 
      routeData.Values.Add("action", "AntiForgery"); 

      var requestContext = new RequestContext(new HttpContextWrapper(Context), routeData); 
      controller.Execute(requestContext); 
     } 
     else 
     { 
      // Process 404 HTTP errors 
      var httpException = exception as HttpException; 
      if (httpException != null && httpException.GetHttpCode() == 404) 
      { 
       Response.Clear(); 
       Server.ClearError(); 
       Response.TrySkipIisCustomErrors = true; 

       // Call target Controller and pass the routeData. 
       IController controller = EngineContext.Current.Locator.GetInstance<CommonController>(); 

       var routeData = new RouteData(); 
       routeData.Values.Add("controller", "Common"); 
       routeData.Values.Add("action", "PageNotFound"); 

       var requestContext = new RequestContext(new HttpContextWrapper(Context), routeData); 
       controller.Execute(requestContext); 
      } 
     } 
    } 

    private void LogException(Exception ex) 
    { 
     if (ex == null) 
      return; 

     // Ignore 404 HTTP errors 
     var httpException = ex as HttpException; 
     if (httpException != null && 
      httpException.GetHttpCode() == 404) 
      return; 

     try 
     { 
      // Log error message 
     } 
     catch (Exception) 
     { 
      // Don't throw new exception if occurs 
     } 
    } 

您可以查看它们使用log4net的在GitHub样本项目。

+0

非常感谢你!有效。你知道如何检查一个viewbag的内容,如果不是null显示一个模式。我知道如何在剃须刀视图中使用viewbag,但我似乎无法将razorview/C#与javascript融合 – AllramEst

+0

您是否可以创建一个新问题并详细阐述一下?如果您提供了一个示例代码,您可能会遇到困难。 – Win

+0

Ofcourse。再次感谢 – AllramEst

相关问题