代码之家  ›  专栏  ›  技术社区  ›  Tim Long

在ASP.NET Web应用程序中有未处理的异常是可以接受的吗?

  •  7
  • Tim Long  · 技术社区  · 14 年前

    我目前正在与提供ASP.NET Web应用程序的第三方供应商合作。Web应用每天生成大约200个未经处理的异常,最终在我的收件箱中显示为电子邮件。经调查,这些错误大多是由GoogleBotWebCrawler为网站编制索引并触发对另一个第三方Web服务的访问(这是对请求的速率限制)触发的。当超过请求限制时,第三方Web服务拒绝该请求,这将导致Web服务器中出现未处理的异常和HTTP/500状态代码。例外情况如下:

    Exception: Exception of type 'System.Web.HttpUnhandledException' was thrown., Stack Trace:    at System.Web.UI.Page.HandleError(Exception e)
       at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
       at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
       at System.Web.UI.Page.ProcessRequest()
       at System.Web.UI.Page.ProcessRequest(HttpContext context)
       at ASP.views_products_detail_aspx.ProcessRequest(HttpContext context)
       at System.Web.Mvc.ViewPage.RenderView(ViewContext viewContext)
       at System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context)
       at System.Web.Mvc.ControllerActionInvoker.c__DisplayClass11.b__e()
       at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
       at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult)
       at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName)
    

    Web应用程序开发人员似乎不愿意处理这些错误,原因是我不太明白。他们的方法是限制GoogleBot,直到错误停止发生(Google的索引相当激进,每天产生大约5000个点击量)。虽然我接受限制谷歌机器人的做法是可行的,但在我看来这是一种逃避。我一直认为未处理的异常是错误。Web应用程序不应该处理这些错误吗?它是 曾经 是否允许发生HTTP/500?网络开发人员怎么看?

    6 回复  |  直到 14 年前
        1
  •  3
  •   Ian Mercer    14 年前

    这里有几个问题 :如果网站显示异常(否),如果网站显示对用户更友好的内容(是),如果网站在无法继续(可能)时向GoogleBot返回500个错误,如果要求GoogleBot减速(是),如果每天不发送500个异常电子邮件节流或总结(可能不是)。

    更多详细信息:

    使用google.com/webmasters,你可以要求google对你的网站进行索引。

    您不应该向用户显示异常,您应该始终捕获它并显示友好的错误页,但在显示该页(例如404或500)时,您需要小心保留HTTP代码,因为如果返回代码为200的页,则该错误页将找到进入搜索e的方法。引擎索引。

    任何错误处理程序都应该对发生错误时发送电子邮件的频率进行限制。

    一个写得好的错误处理程序也应该允许抑制你知道会发生的错误,例如某些搜索引擎坚持请求不存在的页面。

    如果谷歌能让你进入一个速率限制的情况,那么来自用户的高流量可能也能做到这一点,所以总体来说,你似乎也需要某种缓存解决方案。

        2
  •  2
  •   Steven Sudit    14 年前

    不,这是不可接受的。Web应用程序至少应该在global.asax.cs中捕获异常,并对它们做一些合理的处理。

        3
  •  2
  •   Damien Dennehy    14 年前

    Web开发人员不愿意在 Web服务 ?

    这是相当可怕的,因为有很多很多原因导致Web服务可能导致异常。与其要求解决GoogleBot问题,不如让开发人员在Web服务不可用时允许应用程序正常降级。

        4
  •  1
  •   Chris Marisic    14 年前

    在我看来,这是可以接受的。问题是,您已经达到了服务饱和点。有两种方法可以解决这个问题:要么花费增加饱和点所需的金钱和时间,要么分配更多的服务 花时间和金钱使自己不依赖于所说的服务。

    编辑: 第三种选择是遵循纽约时报的脚步,将谷歌视为你服务的窃贼,并禁止他们。当然,这就像把你的头埋在沙子里,但这是一个选择。

        5
  •  0
  •   Marc Stober    14 年前

    Web应用程序正在通过电子邮件向您处理错误。

    我想知道的是,如果一个真正的人类站点访问者遇到这个错误,您希望如何处理它?我想,如果一个真正的人类访客遇到这个错误,您可能会希望收到电子邮件。也许其中一些错误来自真正的人类访客,因为谷歌耗尽了他们的配额?

    似乎您需要一种更优雅的方式来确保站点在没有第三方服务的情况下扩展。我不清楚哪个供应商(ASP.NET开发人员或第三方服务)应该处理它,但这更多的是一个项目管理问题。

        6
  •  -1
  •   Philip Smith    14 年前

    发生了供应商无法控制的情况。供应商已记录错误并向您发送通知。供应商无法控制对Web服务或网站访问者数量的限制。你可以控制两者。

    除非规范规定电子邮件应以某种方式加以限制,否则供应商的立场是合理的。你要完成工作,你得为此付出代价。

    所以你有三个选择

    1. 以某种方式限制谷歌;
    2. 延长您的网络服务津贴;或
    3. 支付修改网站的费用。