0

我的 GWT 应用程序的客户端部分出现了一个错误(可能是 NPE)。它仅在部署时发生。

我得到的唯一消息是 JS 控制台中的 UmbrellaException。没有堆栈跟踪,没有根本原因。

我无法使用 gwt 插件在本地重现该错误,这将向我显示完整的堆栈跟踪。

所以我被困住了。

有什么办法:

  • 在服务器中记录客户端异常?
  • 或者在 js 控制台中打印堆栈跟踪?

谢谢

编辑:供将来参考:如果部署时出现错误而不是 gwt 运行器,那是因为错误与编译的 JS 有关。就我而言,正则表达式的实施不当。

4

2 回答 2

3

可以将 GWT 开发模式与远程服务器一起使用。启动配置必须包括“-noserver”开关以及正确的“-startupUrl”(对应于远程服务器)。您可以像往常一样从本地浏览器访问它:

http://my-remote-server/example?gwt.codesvr=127.0.0.1:9997

请注意,HTTP 主机是远程服务器,但“gwt.codesvr”仍然指向 localhost。这意味着应用程序将在“my-remote-server”中运行服务器端代码,但将使用本地 Eclipse 中的客户端代码,允许您对其进行调试。换句话说,URL 中的“gwt.codesvr”告诉 GWT 浏览器插件从 localhost 即时编译代码,而不是使用远程服务器上的已编译 javascript 代码。我发现这对于调试无法在本地服务器中重现的客户端异常非常有用。

于 2012-08-17T14:16:07.110 回答
0

为了捕获运行时异常,我采用了以下方法:

  1. 为我的应用程序引入了故障排除 GWT 模块,例如MyAppSnapshot.gwt.xml. 在其中我要求 GWT 编译器包含堆栈跟踪数据:

    <?xml version="1.0" encoding="UTF-8"?>
    <module rename-to='client'>
       <inherits name='com.teknoscan.aims.ui.MyAppBase' />
       <set-property name="compiler.stackMode" value="emulated" />
       <set-configuration-property name="compiler.emulatedStack.recordFileNames" value="true" />
    </module>
    

    (还有一个MyAppProduction.gwt.xml删除了上述属性。有关这些属性含义的更多信息,请参见WebModeExceptions。)

  2. 在我的应用程序中引入了一个窗格,当GWT.UncaughtExceptionHandler()捕获运行时异常时会显示该窗格。辅助方法解析并设置堆栈跟踪的文本(如果可用):

      public void setThrowable(Throwable caught) {
      if (!(caught == null || stackTraceTextArea == null)) {
         if (caught.getStackTrace().length == 0) {
            stackTraceTextArea.setText("No stack trace available.");
         } else {
            StringBuffer stb = new StringBuffer();
            stb.append(caught.getMessage() + "\n\nStack trace:\n");
            for (int i = 0; i < caught.getStackTrace().length; i++) {
               stb.append(caught.getStackTrace()[i].toString() + "\n");
            }
            stackTraceTextArea.setText(stb.toString());
         }
      }
    

    (有点重,但结合编译器属性给了我相当清晰的 Java 堆栈跟踪信息。当然不适用于生产构建,因为生成的 JS 更大,您的用户可能看不到堆栈跟踪。)

于 2012-08-17T20:55:14.407 回答