如何避免用户在服务器抛出异常时收到500错误

3
我在服务器日志中看到了以下错误:
  • 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 Code: 500。如需更详细的信息,请查阅位于 D:/Lotus/Domino/data/domino/workspace/logs 的 error-log-0.xml。
这些错误只会在用户的Web浏览器中(源代码)显示。
<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错误。

我希望像其他异常一样,向用户呈现应用程序中设置的错误页面。

有可能吗?

6个回答

5

在您的代码中,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,它甚至不会尝试运行您的代码......页面本身就是无效的,因此您在运行时无能为力。始终确保部署期间签名您的XPages。

5

即使您定义了错误页面,仍然会出现一些“突破”错误。例如,当您将控件拖到自身时。安全性似乎是另一个需要处理的领域。所有这些都是您应该在开发中处理的内容。我没有看到过任何“通常”发生的错误(真正的运行时开发完成和测试后的错误类型)逃脱自定义错误页面。除此之外,请遵循Declan的建议。


这是不是我的问题的答案。 - Thomas Adrian
Thomas,你问:可能吗?我回答:并非所有错误都可以解决。有些错误会引发500错误 - 你无法做任何事情。因此,请确保你已经测试过应用程序。 - stwissel
嗯,我可能不理解这个投票的事情,也不太关心人们在这里得到高分还是低分。我点击了向下箭头,因为我对答案不满意。结果当我重新启动我的http任务时,500错误消失了。就像魔术一样。所以这并不是我在开发过程中可以控制的。很抱歉我点了踩。我真的很享受这次讨论。我没有想到人们会对此感到不满。 - Thomas Adrian
1
Thomas,下投票是可以的,但要用于完全忽略问题或离题的答案。这里不是这种情况。更好的方法是点赞或“标记为答案”,以选出正确的答案并忽略不正确的答案。我会尝试给那些教给我有用知识的恰当回答点赞。这也是对那个分享知识的人花时间的一种感激之情。 - Thimo Jansen
对于XPages社区来说,一个有趣的练习是什么? 列出“突破”错误页面定义的错误。到目前为止,我们知道:
  • 在自定义控件中嵌套自身
  • Java安全错误 我已经发布了一个单独的问题:http://stackoverflow.com/questions/9595883/what-errors-cant-be-trapped-by-a-custom-error-page
- stwissel

4

我也曾遇到过类似的问题,我的错误页面没有显示,而是显示了错误500页面。

我发现我的错误页面也有问题,因此渲染器无法显示原始页面的错误,然后会显示服务器默认的错误页面。

检查是否出现这种问题的最好方法是从一个简单的错误页面开始,不使用主题、不使用ssjs库、页面上没有ssjs代码等,只有一个空白的XPage和一些静态文本来指示它是错误页面。

一旦您确认这可能是错误500的原因,那么您就可以开始构建错误页面,并逐步添加动态内容,直到达到您需要的方式。


我的问题不是找出错误 500 的原因。 - Thomas Adrian
1
@ThomasAdrian 是的,但丑陋的500错误可能是因为您在错误页面本身上有错误。在我的情况下,我的错误页面中有一个函数,它对另一个数据库进行了查找。如果用户在发生错误时未登录,则他们无权访问该其他数据库,并生成了丑陋的500错误,并在日志中显示相同的安全异常。 - Declan Lynch

2
Dmytro Pastovenskyi撰写了一篇关于Domino错误页面的好文章http://dpastov.blogspot.com/2012/01/error-pages-in-domino.html
为了保险起见,我有一个静态的HTML页面,上面写着“发生错误”。此页面由notes.ini中的HTTPMultiErrorPage设置引用在您的服务器上。
然后有一个“HTTP响应头”规则来处理特殊的错误代码。
主要问题仍然是这些是全局设置。因此,没有简单的方法来捕获所有针对您的应用程序的错误。但至少用户不会看到这个烦人的白色错误页面。

1

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

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

getDocumentByUNID()是一个“好”的例子,它会导致丑陋(但标准的)错误500页面显示,而不是应用程序中定义的页面。

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


0
创建一个名为error.xsp的新XPage(例如)。在那里放置一些基本信息,说明出现了问题,为此道歉,并提供一些链接,以便继续工作(即使他/她的数据可能永远丢失-history.go(-1)通常无法解决问题)。在后台,您可以记录错误(建议使用OpenLog)。
打开应用程序属性,选择XPages选项卡。取消选中“显示XPages运行时错误页面”。在“错误页面”组合框中选择您的页面(error)。

Thomas已经设置好了错误页面。他想捕获错误页面无法捕获的错误。 - Per Henrik Lausten
1
我已经学到了一个教训,不要在这里对任何东西进行负面评价。但是这不是答案。我已经定义了一个错误页面。然而,一些错误,比如在我的情况下服务器上的安全异常,正在忽略错误页面。 - Thomas Adrian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接