0

在尝试为 SmartGWT 的 TreeGrid 创建自定义数据源时,我发现自己处于一种非常特殊的情况。在检索请求的 EndRow 属性时,我发现如果它不存在,getEndRow 函数将不会返回 null(或预定义的默认值,-1 就足够了)但它会抛出异常,因为它试图转换为 int 属性的值 (javascript: undefined .java_lang_Integer_value)。我能做的最好的事情就是把所有的东西都放在一个 try catch 中,并让 finally 块设置一个默认值。

int end = 0;
try{
    end = request.getEndRow();
}    
catch(Exception ex) {
    // DO NOTHING or something useless
    end = 0;
}
finally{
    if (end == 0 || end > total) {
       end = total;
    }           
}

输出的 javascript 代码如下所示:

try {
    end = com_smartgwt_client_util_JSOHelper_getAttributeAsInt__Lcom_google_gwt_core_client_JavaScriptObject_2Ljava_lang_String_2Ljava_lang_Integer_2(request.com_smartgwt_client_core_JsObject_jsObj, 'endRow').java_lang_Integer_value;
}
catch ($e0) {
    $e0 = com_google_gwt_lang_Exceptions_caught__Ljava_lang_Object_2Ljava_lang_Object_2($e0);
    if (com_google_gwt_lang_Cast_instanceOf__Ljava_lang_Object_2IZ($e0, Q$java_lang_Exception)) {
        end = 0;
    }
    else
        throw $e0;
}
finally {
    (end == 0 || end > this$static.PCSTC_client_NTDataSource_total) && (end = this$static.com_PCSTC_client_NTDataSource_total);
}

这一切都很好:getAttributeAsInt返回 undefined,因此java_lang_Integer_value不存在。这会导致异常,该异常被捕获。构造了 $e0 异常对象(stacktrace 和所有内容),对 java_lang_Exception 的检查返回true,因此end变量设置为 0。问题是将执行的下一行是 throw $e0;
不仅这没有任何意义,而且在执行 try/catch/finally 块之后,我有一个未捕获的异常:我刚刚处理的异常!错误:见Update3
问题是:是什么导致 if 语句的两个分支都执行,我该如何避免呢?
系统详细信息:带有 GWT SDK 2.5.1 和 SmartGWT 3.1p 的 Windows Server 2008 R2 SP1 上的 FF 20.0

谢谢,
弗洛。

更新

堆栈跟踪:

"com.google.gwt.core.client.JavaScriptException: (TypeError) 
 fileName: http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html
 lineNumber: 335
 stack: PCSTC_client_NTDataSource_$executeFetch__LPCSTC_client_NTDataSource_2Ljava_lang_String_2Lcom_smartgwt_client_data_DSRequest_2Lcom_smartgwt_client_data_DSResponse_2V@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:335
PCSTC_client_GwtRpcDataSource_transformRequest__Lcom_smartgwt_client_data_DSRequest_2Ljava_lang_Object_2@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:326
com_smartgwt_client_data_DataSource_onInit__V/self.transformRequest<@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:268
com_google_gwt_core_client_impl_Impl_apply__Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_Object_2@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:571
com_google_gwt_core_client_impl_Impl_entry0__Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_Object_2@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:609
@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:594
isc_DataSource_getServiceInputs@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_DataBinding.js:463
isc_DataSource_sendDSRequest@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_DataBinding.js:665
isc_DataSource_performDSOperation@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_DataBinding.js:647
isc_DataSource_fetchData@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_DataBinding.js:621
isc_ResultTree_loadChildren@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_DataBinding.js:1366
isc.A.changeDataVisibility@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Grids.js:90
isc_Tree_openFolder@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Grids.js:90
isc_Tree_setRoot@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Grids.js:46
isc_Tree_init@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Grids.js:25
isc_c_Class_invokeSuper@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Core.js:225
isc_ResultTree_init@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_DataBinding.js:1357
isc_Class_completeCreation@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Core.js:263
isc_c_Class_create@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Core.js:169
isc_Canvas_createResultTree@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_DataBinding.js:1415
isc_TreeGrid_createDataModel@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_DataBinding.js:1479
isc_Canvas_filterWithCriteria@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Core.js:2400
isc_Canvas__filter@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Core.js:2399
isc_c_Class_invokeSuper@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Core.js:225
isc_c_Class_Super@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Core.js:218
isc_ListGrid__filter@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Grids.js:1589
isc_Canvas_fetchData@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Core.js:2381
PCSTC_client_SGWT_updateTreeGrid__LPCSTC_client_SPCManager_2V@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:459
com_google_gwt_core_client_impl_Impl_apply__Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_Object_2@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:571
com_google_gwt_core_client_impl_Impl_entry0__Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_Object_2@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:609
@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:594
@http://127.0.0.1:8888/SGWT.html:46
jQuery.event.dispatch@http://127.0.0.1:8888/js/lib/jquery-1.9.1.js:3074
jQuery.event.add/elemData.handle@http://127.0.0.1:8888/js/lib/jquery-1.9.1.js:2750
jQuery.event.trigger@http://127.0.0.1:8888/js/lib/jquery-1.9.1.js:2986
.trigger/<@http://127.0.0.1:8888/js/lib/jquery-1.9.1.js:3677
.each@http://127.0.0.1:8888/js/lib/jquery-1.9.1.js:648
jQuery.prototype.each@http://127.0.0.1:8888/js/lib/jquery-1.9.1.js:270
.trigger@http://127.0.0.1:8888/js/lib/jquery-1.9.1.js:3676
com_google_gwt_lang_EntryMethodHolder_init__V@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:983
com_google_gwt_core_client_impl_Impl_apply__Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_Object_2@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:571
com_google_gwt_core_client_impl_Impl_entry0__Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_Object_2@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:621
@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:594
gwtOnLoad@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:10220
maybeStartModule@http://127.0.0.1:8888/PCSTC.SGWT/PCSTC.SGWT.nocache.js:40
PCSTC_SGWT.onScriptLoad@http://127.0.0.1:8888/PCSTC.SGWT/PCSTC.SGWT.nocache.js:278
@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:10228

更新 2
我应该提到此代码在生产模式下运行,而不是在开发模式下运行,因此这是 javascript 代码(使用 FB 调试)的行为,而不是浏览器 VM 中的 java 代码。

更新 3
无聊的部分:这个意外的 try/catch/finally 语句之后的下一行生成完全相同的异常。我只是快速判断:我认为这是我刚刚处理的异常。事实并非如此。因此,执行try/catch/finally块后我有一个未捕获的异常的语句:我刚刚处理的异常是假的。
有趣的部分:我在 if 语句和 finally 语句之后立即放置了一些警报,如下所示:

1 end = 0;
2 try {
3   end = com_smartgwt_client_util_JSOHelper_getAttributeAsInt__Lcom_google_gwt_core_client_JavaScriptObject_2Ljava_lang_String_2Ljava_lang_Integer_2(request.com_smartgwt_client_core_JsObject_jsObj, 'endRow').java_lang_Integer_value;
4 }
5 catch ($e0) {
6   $e0 = com_google_gwt_lang_Exceptions_caught__Ljava_lang_Object_2Ljava_lang_Object_2($e0);
7   if (com_google_gwt_lang_Cast_instanceOf__Ljava_lang_Object_2IZ($e0, Q$java_lang_Exception)) {
8       alert("then");
9       end = 0;
10  }
11  else {
12      alert("else");
13      throw $e0;
14  }
15 }
16 finally {
17     (end == 0 || end > this$static.PCSTC_client_NTDataSource_total) && (end = this$static.PCSTC_client_NTDataSource_total);
18 }
19 alert("outside");

突出显示(和执行,我想)的顺序如下:1,2,3,5,6,7,8,9,10, 13 ,17, 13 ,19。我不明白的是这一行发生了什么:throw $e0; . 首先,我没想到这条线会被执行。但它是,所以我希望 $e0 被抛出,但显然不是。另一个“怪癖”是第 12 行alert("else"); 永远不会被执行。

总而言之,如果我不调试这部分脚本,我会认为一切正常,实际上结果是预期的:在发生异常的情况下执行 finally 部分。结合我这边的严重疏忽,我想我实际上会关闭这个线程。

非常感谢您对 throw 语句的执行发表评论。

谢谢,弗洛。

4

1 回答 1

1

有一个elsethrow $e0。我不相信代码进入 if-then-block,而是进入 else-block。

if (com_google_gwt_lang_Cast_instanceOf__Ljava_lang_Object_2IZ($e0, Q$java_lang_Exception)) {
    alert("reachable?"); // put this line and run your app again.
    end = 0;
}
else
    throw $e0;

请记住,SmartGWT/GWT 只模拟 Java 运行时库的一个子集。 https://developers.google.com/web-toolkit/doc/1.6/RefJreEmulation

在您的情况下,DSResponse.getEndRow()尝试返回一个整数,该整数是从 long (常量DSRequest.ENDROW_UNSET)转换而来的。根据您的堆栈跟踪,GWT 会引发 JavaScriptException。

JavaScriptException 不是一种 java.lang 包,它可能不在 GWT 支持表中。如果条件不成立,则触发 else 块。

于 2013-05-23T15:53:36.697 回答