Why is this Haxe try-catch block still crashing, when using Release mode for C++ target
我有一个HaxeFlixel项目,在杂项目标(包括flash,neko和Windows)的Debug模式下运行正常。 但是将Windows定位为发布模式时,我发生了意外崩溃,并且令人惊讶的是,它发生在try-catch块中。 这是崩溃功能:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | /** * Will safely scan a parent node's children, search for a child by name, and return it's text. * @param parent an Fast object that is parent of the `nodeNamed` node * @param nodeName the node's name or a comma-separated path to the child (will scan recursively) * @return node's text as String, or null if child is not there */ public static function getNodeText(parent:Fast, nodeName:String):String { try { var _node : Fast = getNodeNamed(parent, nodeName); //if (_node == null) // return null; // next line will crash if _node is null var it :Iterator<Xml> = _node.x.iterator(); if ( it == null || !it.hasNext() ) return null; var v = it.next(); var n = it.next(); if( n != null ) { if( v.nodeType == Xml.PCData && n.nodeType == Xml.CData && StringTools.trim(v.nodeValue) =="" ) { var n2 = it.next(); if( n2 == null || (n2.nodeType == Xml.PCData && StringTools.trim(n2.nodeValue) =="" && it.next() == null) ) return n.nodeValue; } //does not only have data (has children) return null; } if( v.nodeType != Xml.PCData && v.nodeType != Xml.CData ) //does not have data"; return null; return v.nodeValue; }catch (err:Dynamic) { trace("Failed parsing node Text [" + nodeName+"]" + err ); return null; } } |
通过启用
我的IDE是FlashDevelop,我正在使用HaxeFlixel 3.3.6,lime 0.9.7和openFL 1.4.0,如果有什么不同的话
编辑:我怀疑这与转换的C ++代码如何错过
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | STATIC_HX_DEFINE_DYNAMIC_FUNC2(BaxXML_obj,_getNodeNamed,return ) ::String BaxXML_obj::getNodeText( ::haxe::xml::Fast parent,::String nodeName){ HX_STACK_FRAME("bax.utils.BaxXML","getNodeText",0x4a152f07,"bax.utils.BaxXML.getNodeText","bax/utils/BaxXML.hx",56,0xf6e2d3cc) HX_STACK_ARG(parent,"parent") HX_STACK_ARG(nodeName,"nodeName") HX_STACK_LINE(56) try { HX_STACK_CATCHABLE(Dynamic, 0); { HX_STACK_LINE(57) ::haxe::xml::Fast _node = ::bax::utils::BaxXML_obj::getNodeNamed(parent,nodeName); HX_STACK_VAR(_node,"_node"); HX_STACK_LINE(63) Dynamic it = _node->x->iterator(); HX_STACK_VAR(it,"it"); // ... Let's skip the irrelevant code } catch(Dynamic __e){ { HX_STACK_BEGIN_CATCH Dynamic err = __e;{ HX_STACK_LINE(82) ::String _g5 = ::Std_obj::string(err); HX_STACK_VAR(_g5,"_g5"); HX_STACK_LINE(82) ::String _g6 = (((HX_CSTRING("Failed parsing node Text [") + nodeName) + HX_CSTRING("]")) + _g5); HX_STACK_VAR(_g6,"_g6"); HX_STACK_LINE(82) ::haxe::Log_obj::trace(_g6,hx::SourceInfo(HX_CSTRING("BaxXML.hx"),82,HX_CSTRING("bax.utils.BaxXML"),HX_CSTRING("getNodeText"))); HX_STACK_LINE(83) return null(); } } } HX_STACK_LINE(56) return null(); } |
您定义了哪些hadedefs?
将这些添加到您的project.xml中可能会有所帮助:
1 2 3 | <haxedef name="HXCPP_CHECK_POINTER"/> <!--makes null references cause errors--> <haxedef name="HXCPP_STACK_LINE" /> <!--if you want line numbers--> <haxedef name="HXCPP_STACK_TRACE"/> <!--if you want stack traces--> |
您也可以尝试crashdumper库:
https://github.com/larsiusprime/crashdumper
(Crashdumper默认将HXCPP_CHECK_POINTER作为其include.xml的一部分打开,并将为hxcpp的错误和openfl / lime的未捕获的错误事件设置钩子)
我想这可以归结为C ++如何处理空指针异常。 不会!
在此处或此处了解更多信息
这似乎很奇怪,有些问题可能有助于解决它。
-
看起来您对xml的外观做了很多假设(做一些手动
it.next() ),为什么呢? - 为什么要使用这个大屁股的try-catch块?
-
getNodeNamed的外观如何,似乎它可以返回
null 。 - 您是否有示例XML可以测试?