XPages自定义错误页-获取错误消息和行

XPages自定义错误页-获取错误消息和行,xpages,Xpages,我正在尝试为我的xpages生成一个自定义错误页。我在谷歌上搜索了很多解决方案,到目前为止,我得到了一个错误页面,告诉我发生了一个错误 但我无法获得确切发生的信息(在本例中,错误是必须保存“doc”,但我将变量命名为“docs”只是为了获得错误) 我所做的就是: var errObj = requestScope.error; output = errObj.getCause().getErrorPropertyId(); output = errObj.getCause().getCompo

我正在尝试为我的xpages生成一个自定义错误页。我在谷歌上搜索了很多解决方案,到目前为止,我得到了一个错误页面,告诉我发生了一个错误

但我无法获得确切发生的信息(在本例中,错误是必须保存“doc”,但我将变量命名为“docs”只是为了获得错误)

我所做的就是:

var errObj = requestScope.error; 
output = errObj.getCause().getErrorPropertyId();
output = errObj.getCause().getComponentId();
当我尝试调用getExpressionText()时,我得到一个错误500


如何获取信息、错误发生的位置(行号)以及导致错误的变量就像我使用标准错误页面一样。

看看Tony McGuckin的XSnippet:。它使用以下内容输出有关错误的详细信息:

  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;

现在,我已经使用和处理了这个问题

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


我还实现了一个“报告此问题”链接按钮,用于创建一封新的电子邮件,其中包含有关用户当前所在会话的重要信息。

从requestScope.error无法轻松访问错误行和详细信息。如果您查看Mark Leusink调试工具栏最新版本的源代码,您将看到他正在解析堆栈跟踪以获取详细信息

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

如果你看一下我放在OpenNTF上的XPages OpenLogger项目,那就是我用来记录OpenLog完整细节的地方

您可以在此处看到OpenLogPhaseListener的源代码,它使用以下方法:

即使您不是Java专家,使用SSJS的关键部分也应该是可以理解的。第84行捕获未捕获的异常-当XPages路由到默认错误页时。它使用了我提到的方法

如果只使用catch块,第98行到第105行将注销所有详细信息,传递
OpenLogBean.addError(e,this)
其中
e
是错误对象,
this
是错误发生的组件。Java代码中的error.getError()检索该错误对象。要在SSJS中提前输入,您需要使用
catch(e:com.ibm.jscript.translationexception)
我相信


我还没有测试过这个,我只是从我在OpenNTF上用于项目的代码中恢复过来。

谢谢,这已经是我正在使用的代码了。但是在我的自定义错误页面中使用这段代码,我得到了以下错误消息:“Fehler beim Ausführen eines JavaScript Aktionsausdrucks。”因此没有关于代码行的信息或到底发生了什么。但是使用XPage标准错误页面,我得到了更多的信息:“Script explorerfehler,Zeile=5,Spalte=9:[ReferenceError]‘docs’nicht gefunden”,甚至代码行也会显示出来。谢谢!我将尝试一下,但这似乎是正确的方法,因为调试工具栏日志记录的工作方式似乎类似。