在MVC c#.net中自定义异常错误页面

本文关键字:错误 自定义异常 MVC net | 更新日期: 2023-09-27 18:16:54

我一直在寻找文章,我可以根据我的应用程序中的异常自定义我的错误页面。我尝试了下面的方法

public class ErrorController : Controller
{
    public ActionResult Index(int status, Exception error)
    {
        Response.StatusCode = status;
        ViewBag.status = status;
        return View(status);
    }
    protected override void Dispose(bool disposing)
    {
        base.Dispose(disposing);
    }
}

global.asax

protected void Application_Error(object sender, EventArgs e)
{
    var ex = Server.GetLastError().GetBaseException();
    Server.ClearError();
    var routeData = new RouteData();
    routeData.Values.Add("controller", "Error");
    routeData.Values.Add("action", "Index");
    if (ex.GetType() == typeof(HttpException))
    {
        var httpException = (HttpException)ex;
        var code = httpException.GetHttpCode();
        routeData.Values.Add("status", code);
    }
    else
    {
        routeData.Values.Add("status", 500);
    }
    routeData.Values.Add("error", ex);
    IController errorController = new trialerror.Controllers.ErrorController();
    errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
}
protected void Application_EndRequest(object sender, EventArgs e)
{
    if (Context.Response.StatusCode == 401)
    { // this is important, because the 401 is not an error by default!!!
        throw new HttpException(401, "You are not authorised");
    }
}

index.cshtml

 @{
        ViewBag.Title = "Index";
    }
    <h2>Index</h2>
    <html>
    <head>
        <title> Error</title>
    </head>
    <body>
        <div>
        @{
            int x=ViewBag.status;
        }
            <p style=" color: Red;">
            @switch (x) {
                case 401: {
                        <span>PAGE NOT FOUND</span>
                    }
                    break;
                case 403: {
                        <span>FORBIDDEN</span>
                    }
                    break;
                case 404: {
                        <span>We have experienced a 404 error.Site temporarily down</span>
                    }
                    break;
                case 500: {
                        <span>please refresh page and try again!</span>
                    }
                    break;
                //and more cases for more error-codes...
                default: {
                        <span>Unknown error!!!</span>
                    }
                    break;
            }
            </p>
        </div>
    </body>
    </html>

代码可以为case中的所有错误提供定制的页面,但是现在我想从try -catch方法中捕获所有异常,如db异常,并以定制的方式显示。

示例:"null值异常或连接字符串异常"。

我的疑问是,我怎样才能证明这一点呢?我不知道该不该继续?

在MVC c#.net中自定义异常错误页面

但是现在我想从try -catch方法中捕获所有异常,如db异常,并以自定义的方式显示

两个选择:

  1. 让异常转义(在catch中不带参数的throw将重新抛出相同的异常),并遵循正常的路由处理异常

  2. 对于任何其他控制器/动作,重定向到ErrorController.Action

#2留下了将异常对象传递给控制器的问题(这将需要错误控制器中的不同代码路径来拾取传递给Exception实例的两个方法),因此#1通常是更容易的选择。