尝试为SmartGWT的TreeGrid创建自定义数据源时,发现自己处于一种非常特殊的状态。在检索请求的EndRow属性时,我发现如果它不存在,getEndRow函数将不会返回null(或者预定义的默认值,-1会足够好),但会引发异常,因为它会尝试转换为属性的值(javascript:undefined .java_lang_Integer_value)。我可以做的最好的事情是把所有东西都放在try catch中,并让finally块设置一个默认值。执行IF语句的两个分支
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回报不确定,所以java_lang_Integer_value不存在。这会导致被捕获的异常。 $ e0异常对象构造(stacktrace和所有内容),对java_lang_Exception的检查返回true,所以结束变量设置为0. 问题是将要执行的下一行是throw $ e0;
不仅这样做没有感觉,而且在执行try/catch/finally块之后,我有一个未捕获的异常:我刚处理的异常! False:see Update3
问题是:什么导致if语句的两个分支的执行以及如何避免它?
系统细节:在Windows Server 2008上的FF 20.0 R2 SP1与GWT SDK 2.5.1和SmartGWT的3.1p
谢谢
弗洛。
UPDATE
堆栈跟踪:
"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[email protected]http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:335
PCSTC_client_GwtRpcDataSource_transformRe[email protected]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_Ob[email protected]http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:571
com_google_gwt_core_client_impl_Impl_entry0__Ljava_lang_Ob[email protected]http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:609
@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:594
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_DataBinding.js:463
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_DataBinding.js:665
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_DataBinding.js:647
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_DataBinding.js:621
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_DataBinding.js:1366
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Grids.js:90
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Grids.js:90
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Grids.js:46
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Grids.js:25
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Core.js:225
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_DataBinding.js:1357
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Core.js:263
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Core.js:169
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_DataBinding.js:1415
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_DataBinding.js:1479
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Core.js:2400
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Core.js:2399
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Core.js:225
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Core.js:218
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Grids.js:1589
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Core.js:2381
[email protected]tp://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:459
com_google_gwt_core_client_impl_Impl_apply__Ljava_lang_Ob[email protected]http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:571
com_google_gwt_core_client_impl_Impl_entry0__Ljava_lang_Ob[email protected]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
[email protected]://127.0.0.1:8888/js/lib/jquery-1.9.1.js:3074
jQuery.event.add/[email protected]://127.0.0.1:8888/js/lib/jquery-1.9.1.js:2750
[email protected]://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
[email protected]://127.0.0.1:8888/js/lib/jquery-1.9.1.js:648
[email protected]://127.0.0.1:8888/js/lib/jquery-1.9.1.js:270
[email protected]://127.0.0.1:8888/js/lib/jquery-1.9.1.js:3676
[email protected]://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[email protected]://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:571
com_google_gwt_core_client_impl_Impl_entry0__Ljava_lang_Ob[email protected]http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:621
@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:594
[email protected]://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:10220
[email protected]://127.0.0.1:8888/PCSTC.SGWT/PCSTC.SGWT.nocache.js:40
[email protected]://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块之后的声明我有一个未捕获的异常:我刚刚处理的异常为false。
有趣的部分:我放了一些警告的if语句后,立即在最后陈述中,像这样:
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,,17,,19。我不明白的是这条线发生了什么:throw $ e0;。首先我没有想到这条线会被执行。但事实是,所以我期望$ e0被抛出,但显然不是。另一个“怪癖”是,第12行alert(“else”);永远不会执行。总而言之,如果我不想调试这部分脚本,我会认为一切正常,实际上结果是预期的结果:在出现异常时执行finally部分。结合我身边的总体监督,我想我会真的关闭这个线程。
我将非常感谢您对throw语句执行的评论。
谢谢, Flo。
你可以包含你提到的堆栈跟踪吗? –