0

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

但是我无法获得确切发生的信息(在这种情况下,错误是必须保存“doc”,但我将变量命名为“docs”只是为了得到错误)。

我所做的就是:

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

当我尝试调用 getExpressionText() 时,我得到一个错误 500。

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

4

3 回答 3

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;
于 2013-03-20T14:45:57.110 回答
1

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

但是,您可以使用 SSJS 异常的底层 Java 类访问所有相关信息 - 使用 getErrorLine() 的 com.ibm.jscript.InterpretException。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 路由到默认错误页面时。那使用我提到的方法。

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

我还没有测试过这个,我只是从我在 OpenNTF 上的项目中使用的东西开始工作。

于 2013-03-26T23:36:14.853 回答
0

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

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

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

于 2013-03-26T12:27:21.770 回答