代码之家  ›  专栏  ›  技术社区  ›  Dmytrii Nagirniak

在应用程序出错时将异常转换为HTTP 404响应

  •  5
  • Dmytrii Nagirniak  · 技术社区  · 16 年前

    首先,快速实现我真正想要实现的目标: 将特定异常转换为HTTP 404,以便ASP.NET可以进一步处理它。 .

    我以这种方式处理ASP.NET(MVC2)中的异常:

        protected void Application_Error(object sender, EventArgs e) {
            var err = Server.GetLastError();
            if (err == null)
                return;
            err = err.GetBaseException();
    
            var noObject = err as ObjectNotFoundException;
            if (noObject != null)
                HandleObjectNotFound();
    
            var handled = noObject != null;
            if (!handled)
                Logger.Fatal("Unhandled exception has occured in application.", err);
        }
    
        private void HandleObjectNotFound() {
            Server.ClearError();
            Response.Clear();
            // new HttpExcepton(404, "Not Found"); // Throw or not to throw?
            Response.StatusCode = 404;
            Response.StatusDescription = "Not Found";
            Response.StatusDescription = "Not Found";
            Response.Write("The whole HTML body explaining whata 404 is??");
        }
    

    问题是我无法配置默认值 customErrors 与之合作。当它是 on 然后它从不重定向到 客户错误 : <error statusCode="404" redirect="404.html"/> .

    我也试着提高 new HttpExcepton(404, "Not Found") 来自处理程序,但响应代码是 200 我不明白为什么。

    所以问题是:

    1. 正确的翻译方法是什么 AnException 进入HTTP 404 反应?
    2. 如何 客户错误 处理应用程序异常时的部分工作\u错误?
    3. 为什么抛出httpexception(404)呈现(空白)状态为success(200)的页面?

    谢谢,
    Dmitriy。

    1 回复  |  直到 13 年前
        1
  •  2
  •   xpda    13 年前

    换句话说,如果在应用程序出错时手动设置HTTP状态,则会失去使用customErrors部分处理程序的可能性,因为您调用了server.clearror()。

    在应用程序出错之前处理异常或从httpexception派生异常。

    • 将异常转换为HTTP 404响应的正确方法是什么?

    最好在控制器中处理异常。您可以引入基类控制器并处理自定义handleError属性中的大多数异常。您可以抛出httpexception their,它将由customErrors部分处理程序正确处理。

    还可以从httpException(404)派生ObjectNotFoundException异常

    应用程序错误是处理异常的最后机会。您只有响应API来处理它。您可以手动设置状态代码并写入响应,或者手动触发重定向到自定义错误页,或者将server.transferRequest()调用到现有的HTML或ASPX文件(而不是控制器操作)。在当前的ASP.NET版本中,不能在应用程序的“错误方法”中设置或更改server.getLastError,只能检索或清除它。

    • 在处理应用程序错误中的异常时,customErrors部分如何工作?

    通过调用server.clearror()还可以清除当前请求错误,因此客户错误部分处理程序不处理该错误。

    • 为什么抛出httpexception(404)呈现(空白)状态为success(200)的页面?

    您不应该在应用程序错误方法中引发任何异常。异常意味着错误处理失败。

    推荐文章