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

时间:2013-03-20 14:20:27

标签: xpages

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

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

我所做的就是:

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

一旦我尝试调用getExpressionText(),我就会收到500错误。

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

3 个答案:

答案 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 ToolbarOpenLog Database处理此问题。

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

我还实施了一个"报告此问题" Link-Button用于创建新的电子邮件,其中包含有关用户当前所在会话的重要信息。