2013-03-20 78 views
0

我试图为我的xpages生成一个自定义错误页面。我搜索了很多解决方案,到目前为止,我收到一个错误页面告诉我,发生错误。XPages自定义错误页面 - 获取错误消息和行

但我无法得到信息究竟发生了什么(在这种情况下,错误是,“文档”必须保存,但我命名变量“文档”只是为了得到错误)。

所有我做的是:

var errObj = requestScope.error; 
output = errObj.getCause().getErrorPropertyId(); 
output = errObj.getCause().getComponentId(); 

只要我打电话getExpressionText()我得到一个错误500

我如何获得的信息,在发生错误(行号)和导致错误的变量? - 就像我使用标准错误页面一样。

回答

1

错误行和细节并不方便来自requestScope.error。如果您查看Mark Leusink调试工具栏最新版本的源代码,您会看到他正在解析堆栈跟踪以获取详细信息。

但是,您可以使用底层Java类为SSJS异常访问所有相关信息 - com.ibm.jscript.InterpretException使用getErrorLine()。 getLocalizedMessage()方法获取通常开始“脚本解释器错误”的错误细节。 getExpressionText()方法检索抛出错误的行。

如果您看看我放在OpenNTF上的XPages 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行捕获未捕获的异常 - 当XPages路由到默认错误页面时。这使用我提到的方法。

线98到105是记录了所有的细节,如果你只使用一个catch块,路过OpenLogBean.addError(e, this)其中e是错误对象和this是发生在错误的组件的人。 Java代码中的error.getError()将检索该错误对象。为了获得SSJS中的预测,您需要使用catch(e:com.ibm.jscript.InterpretException)我相信。

我还没有测试过这个,我刚从我在OpenNTF上的项目中使用过。

+0

好的,谢谢!我会试一试,但这似乎是正确的方式,因为调试工具栏日志记录似乎工作相似。 – 2013-03-28 07:44:47

1

看一下Tony McGuckin的这个XSnpet: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; 
+0

谢谢,这已经是我正在使用的代码。但是,在我的自定义错误页面中使用此代码时,出现以下错误消息:“Fehler beimAusführeneines JavaScript-Aktionsausdrucks。”所以没有关于代码行的信息或者发生了什么。但是使用XPage Standard错误页面,我得到了更多的信息:“Script-Interpreterfehler,Zeile = 5,Spalte = 9:[ReferenceError]'docs'nicht gefunden”,甚至显示代码行 – 2013-03-20 14:54:47

0

现在我已经通过Debug ToolbarOpenLog Database处理这个问题。

如果发生错误,用户只能得到一个自定义的错误页面(使用调试工具栏的例子)和信息,出错了。所以他不必担心任何其他问题甚至堆栈跟踪。但在同一时刻,他得到错误页面,错误记录在我们的日志数据库中,包含所有需要的信息(如行,确切的错误信息等)。

我还实施了“将此问题报告”链接,按钮来创建包含关于用户当前会话重要信息的新电子邮件。