【问题标题】:How to avoid users getting 500 Errors when server throw exception服务器抛出异常时如何避免用户收到 500 错误
【发布时间】:2012-03-06 09:55:21
【问题描述】:

我的服务器日志中出现以下错误。

  • 2012-03-06 09:20:43 HTTP JVM:CLFAD0211E:抛出异常。有关更多详细信息,请参阅位于 D:/Lotus/Domino/data/domino/workspace/logs 中的 error-log-0.xml
  • 2012-03-06 09:20:43 HTTP JVM:CLFAD0229E:发生安全异常服务请求:/demo.nsf/home.xsp - HTTP 代码:500。有关更多详细信息,请参阅错误日志- 0.xml 位于 D:/Lotus/Domino/data/domino/workspace/logs

用户只能在网络浏览器中看到这个(来源)

<html>
<head>
<title>Error</title></head>
<body text="#000000">
<h1>Error 500</h1>HTTP Web Server: Command Not Handled Exception</body>
</html>

所以我可以通过服务器日志判断服务器抛出了一个安全异常,可能是因为我的 java.policy 文件中的设置有误。但我的问题不是导致错误的原因,而是如何避免用户收到这些丑陋的 500 错误。

我希望我在应用程序中设置的错误页面能够像任何其他异常一样呈现给用户。

可能吗?

【问题讨论】:

    标签: security exception error-handling xpages


    【解决方案1】:

    代码中的 try/catch 块越多越好(当然在合理范围内):

    try {
     // code that might throw an error
    } catch (e) {
     // examine the error to see if there's a workaround
     // if not, log it and inform the user
    } finally {
     // any code that needs to run whether or not there was an error
    }
    

    这样,如果某事失败,它会优雅地失败。只要确保让用户清楚地知道出了什么问题(并且最好向他们提供他们可以实际跟进的说明)......如果出现问题并且用户认为,静默失败甚至比丑陋的错误页面更糟糕一切都很好。

    附:正如 Stephan 所指出的,有些错误根本无法被捕获。例如,如果 XPage 没有由有权运行 XPages 的人签名,它甚至永远不会尝试运行您的代码……页面本身是无效的,因此您在运行时无能为力。始终确保您的 XPage 在部署期间已签名。

    【讨论】:

      【解决方案2】:

      即使您定义了错误页面,仍有许多“突破”错误。例如。当您将控件拖到自身上时。安全似乎是另一个领域。所有这些都是你应该在开发中处理的东西。我还没有看到“通常”发生的错误(在开发完成和测试错误类型后的真正运行时)转义自定义错误页面。除此之外,请遵循德克兰的建议。

      【讨论】:

      • 这不是我的问题的答案
      • Thomas 它是:你问:可能吗?我说:不是所有的错误。有些错误会引发 500 错误 - 您对此无能为力。因此,请确保您已经测试了这些应用程序。
      • 好吧,我可能不明白这个投票的事情,我不太关心人们在这里获得高分或低分。我点击了向下箭头,因为我对答案不满意。事实证明,当我重新启动我的 http 任务时,500 错误消失了。像魔术一样。所以这在我的开发过程中是我无法控制的。很抱歉投反对票。我真的很喜欢讨论。我不认为人们会对此感到不安。
      • Thomas,投反对票是可以的,但将它用于完全错过问题或离题的答案。情况并非如此。最好投票或“标记为答案”以挑选出正确的答案并留下不正确的答案。我尝试对可以教会我一些东西的主题答案进行投票。以感谢对方花时间分享知识
      • 对于 XPages 社区来说,一个有趣的练习是:列出“突破”错误页面定义的错误。到目前为止,我们知道: - 在自身内嵌套自定义控件 - java 安全错误 我为此发布了一个单独的问题:stackoverflow.com/questions/9595883/…
      【解决方案3】:

      我也遇到过这样的问题,我的错误页面没有显示,而是显示错误 500 页面。

      我发现我的错误页面也存在问题,因此渲染器无法显示原始页面的错误,而您获得的是服务器默认错误页面。

      检查这是否是您的特定问题的原因的最佳方法是从一个简单的错误页面开始,没有主题,没有 ssjs 库,页面上没有 ssjs 代码等,只是一个带有一些静态文本的空白 xpage表示是错误页面。

      一旦您确认这是错误 500 的可能原因,您就可以开始构建该错误页面并一点一点地添加动态内容,直到您需要它为止。

      【讨论】:

      • 我的问题不是要找出错误500的原因
      • @ThomasAdrian 是的,但丑陋的 500 错误可能是因为错误页面本身有错误。就我而言,我的错误页面中有一个函数可以查找另一个数据库。如果发生错误时用户没有登录,他们就没有其他数据库的权限,它会生成丑陋的 500 错误并在日志中显示相同的安全异常。
      【解决方案4】:

      Dmytro Pastovenskyi 有一篇很好的文章 http://dpastov.blogspot.com/2012/01/error-pages-in-domino.html 关于 Domino 中的错误页面。

      为了安全起见,我有一个静态 html 页面显示“发生错误”。此页面由服务器上 notes.ini 中的 HTTPMultiErrorPage 设置引用。

      然后有一个“HTTP 响应标头”规则处理特殊错误代码。

      主要问题仍然是,这些是全局设置。因此,没有简单的方法可以专门为您的应用程序捕获所有错误。但至少用户不会得到这个烦人的白色错误页面。

      【讨论】:

        【解决方案5】:

        我也遇到过类似的问题。错误消息从覆盖应用程序定义的错误页面的某些潜在错误中冒出来。这不是一个好的行为(从用户的角度来看),让你感觉有点赤裸。我确实理解应用程序很难捕获这些消息 - 但至少应该有一种方法来自定义该消息 - 默认错误 500 页面对普通用户来说并不是很有用......

        尝试避免您的代码抛出此类错误(ssjs/java)的唯一(?)方法是(正如 Tim Tripcony 已经提到的)始终在代码周围使用 try/catch 语句(你已经知道了:))

        getDocumentByUNID() 是一种方法的“好”示例,该方法将导致显示丑陋(但标准)错误 500 页面而不是应用程序中定义的页面。

        至于任何其他错误类型(系统/安全等) - 我认为不可能将它们重定向到(由用户)调用的应用程序错误页面,因为它们不是从应用程序调用的,而是在应用程序被调用(我希望我错了)。

        【讨论】:

          【解决方案6】:

          创建一个名为 error.xsp 的新 XPage(例如)。放一些基本信息表明出了点问题,为此道歉并提供一些链接如何继续工作(即使他/她的数据可能永远丢失 - history.go(-1) 通常不能解决问题) .在后台你可以记录错误(推荐使用 OpenLog)。

          打开应用程序属性,XPages 选项卡。取消选中显示 XPages 运行时错误页面。在组合错误页面中选择您的页面(错误)。

          【讨论】:

          • Thomas 已经设置了错误页面。他想捕捉错误页面没有捕捉到的错误。
          • 我已经吸取了教训,不要在这里投反对票。但这不是答案。我已经定义了错误页面。但是,在我的情况下,服务器上的安全异常等一些错误忽略了错误页面
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多