我正在尝试为我的xpages生成自定义错误页面。我搜索了很多解决方案,到目前为止,我得到一个错误页面告诉我,发生了错误。
但我无法得到确切发生的信息(在这种情况下,错误是,必须保存“doc”,但我将变量命名为“docs”只是为了得到错误)。
我所做的就是:
var errObj = requestScope.error;
output = errObj.getCause().getErrorPropertyId();
output = errObj.getCause().getComponentId();
一旦我尝试调用getExpressionText(),我就会收到500错误。
如何获取信息,错误发生的位置(行号)和导致错误的变量? - 就像我使用标准错误页面一样。
答案 0 :(得分:1)
看看Tony McGuckin的这个XSnippet:http://openntf.org/XSnippets.nsf/snippet.xsp?id=custom-error-page-cw-cause-and-stacktrace-information。它使用以下内容输出错误的详细信息:
var output = requestScope.error.toString()+"\n\n";
if(requestScope.error instanceof com.ibm.xsp.exception.XSPExceptionInfo){
var codeSnippet = requestScope.error.getErrorText();
var control = requestScope.error.getErrorComponentId();
var cause = requestScope.error.getCause();
output += "In the control : " + control + "\n\n";
if(cause instanceof com.ibm.jscript.InterpretException){
var errorLine = cause.getErrorLine();
var errorColumn = cause.getErrorCol();
output += "At line " + errorLine;
output += ", column " + errorColumn + " of:\n";
}else{
output += "In the script:\n";
}
output += codeSnippet;
}
return output;
答案 1 :(得分:1)
从requestScope.error无法轻松访问错误行和详细信息。如果你查看Mark Leusink调试工具栏的最新版本的源代码,你会看到他正在解析堆栈跟踪以获取详细信息。
但是,您可以使用底层Java类访问SSJS异常 - com.ibm.jscript.InterpretException,使用getErrorLine()访问所有相关信息。 getLocalizedMessage()方法获取通常启动“脚本解释器错误”的错误详细信息。 getExpressionText()方法检索引发错误的行。
如果你看一下我在OpenNTF上放置的XPage OpenLog Logger项目,那就是我用来记录OpenLog的全部细节。 http://www.openntf.org/Internal/home.nsf/project.xsp?action=openDocument&name=XPages%20OpenLog%20Logger
您可以在此处查看使用这些方法的OpenLogPhaseListener的源代码:https://github.com/paulswithers/openlogjava/blob/master/OpenLogJava/WebContent/WEB-INF/src/com/paulwithers/openLog/OpenLogPhaseListener.java
即使你不是Java专家,使用SSJS关键部分应该是可以理解的。第84行捕获未捕获的异常 - 当XPage路由到默认错误页面时。这使用了我提到的方法。
第98到105行是那些在你只使用一个catch块时注销所有细节的行,传递OpenLogBean.addError(e, this)
e
是错误对象而this
是组件发生错误。 Java代码中的error.getError()检索该错误对象。要获得SSJS中的预先输入,您需要使用catch(e:com.ibm.jscript.InterpretException)
我相信。
我没有对此进行过测试,我只是回过头来处理OpenNTF上的项目。
答案 2 :(得分:0)
目前我已使用Debug Toolbar和OpenLog Database处理此问题。
如果发生错误,用户只会获得一个自定义错误页面(使用调试工具栏的示例)和信息,那就是出错了。所以他不必为任何其他问题甚至堆栈跟踪而烦恼。但是在他获得错误页面的同一时刻,错误记录在我们的Log-Database中,包含所有需要的信息(如行,确切的错误消息等)。
我还实施了一个"报告此问题" Link-Button用于创建新的电子邮件,其中包含有关用户当前所在会话的重要信息。