【问题标题】:how to approach Exception handing and custom error page in ASP.NET MVC如何在 ASP.NET MVC 中处理异常处理和自定义错误页面
【发布时间】:2015-04-10 10:06:03
【问题描述】:

我正在学习 ASP.NET MVC 中的异常处理,我想要实现的是单个自定义错误页面,该页面显示带有异常详细信息的错误,当然这可能会有所不同,具体取决于生成的位置。我不确定是否在正确的轨道上开始! 但是我有读取 SQL 存储过程和返回值的 C# 代码,我想添加代码级异常处理,即 try、catch 和 finally 但想在自定义错误页面上显示错误。我怎样才能做到这一点??

public List<GetAllFunction_SP_Map> GetAllFunction_From_StoreProcedure()
    {  
            List<GetAllFunction_SP_Map> query;

            using (var dbContext = new FunctionContext())
            {
                query = dbContext.Database.SqlQuery<GetAllFunction_SP_Map>("exec GetAllFunction").ToList();
            }

            return query;      
}

【问题讨论】:

标签: c# asp.net-mvc exception-handling


【解决方案1】:

在您的 web.config 中添加自定义错误部分

<configuration>
    <system.web>
        <customErrors mode="RemoteOnly">
            <error statusCode="500"
                   redirect="~/Error/InternalServer" />
            <error statusCode="404"
                   redirect="~/Error/NotFound" />
        </customErrors>
    </system.web>
</configuration>

对于内部服务器错误,您可以显示 ViewBag 从您的控制器发送的错误消息。 因此,当您捕获异常时,再次抛出它,但在您的 ViewBag 中设置异常消息。您可以做更多的工作来显示更友好的消息,但从错误页面或从发生错误的点记录错误。

【讨论】:

    【解决方案2】:

    [1]:从 Web.config 中删除所有“customErrors”和“httpErrors”

    [2]:检查 'App_Start/FilterConfig.cs' 看起来像这样:

    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }
    }
    

    [3]:在'Global.asax'中添加这个方法:

    public void Application_Error(Object sender, EventArgs e)
    {
        Exception exception = Server.GetLastError();
        Server.ClearError();
    
        var routeData = new RouteData();
        routeData.Values.Add("controller", "ErrorPage");
        routeData.Values.Add("action", "Error");
        routeData.Values.Add("exception", exception);
    
        if (exception.GetType() == typeof(HttpException))
        {
            routeData.Values.Add("statusCode", ((HttpException)exception).GetHttpCode());
        }
        else
        {
            routeData.Values.Add("statusCode", 500);
        }
    
        Response.TrySkipIisCustomErrors = true;
        IController controller = new ErrorPageController();
        controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
        Response.End();
    }
    

    [4]: 添加'Controllers/ErrorPageController.cs'

    public class ErrorPageController : Controller
    {
        public ActionResult Error(int statusCode, Exception exception)
        {
            Response.StatusCode = statusCode;
            ViewBag.StatusCode = statusCode + " Error";
            return View();
        }
    }
    

    [5]:在“视图/共享/Error.cshtml”中

    @model System.Web.Mvc.HandleErrorInfo
    @{
        ViewBag.Title = (!String.IsNullOrEmpty(ViewBag.StatusCode)) ? ViewBag.StatusCode : "500 Error";
    }
    
     <h1 class="error">@(!String.IsNullOrEmpty(ViewBag.StatusCode) ? ViewBag.StatusCode : "500 Error"):</h1>
    
    
    //@Model.ActionName
    //@Model.ContollerName
    //@Model.Exception.Message
    //@Model.Exception.StackTrace
    

    【讨论】:

      猜你喜欢
      • 2010-11-21
      • 2016-04-10
      • 1970-01-01
      • 2010-12-24
      • 2010-10-20
      • 1970-01-01
      • 2020-07-11
      • 2010-11-13
      相关资源
      最近更新 更多