Почему этот блок try-catch Haxe все еще падает, когда используется режим Release для цели C ++

У меня есть проект HaxeFlixel, который работает нормально в режиме отладки для разных целей, включая flash, neko и windows. Но Таргетинг Windows в Режим выпуска, У меня неожиданный сбой, и неожиданно это происходит внутри блока try-catch. Вот функция сбоя:

/**
* 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;
}
}

Включая if (_node == null) return null; линия, он снова работает безопасно. Улавливая ошибки как Dynamic Я думал, что я должен был поймать все возможные типы ошибок! Почему это происходит? И почему он появляется в режиме релиза?

Моя IDE — FlashDevelop, и я использую HaxeFlixel 3.3.6, lime 0.9.7 и openFL 1.4.0, если это что-то меняет

РЕДАКТИРОВАТЬ: я подозреваю, что это связано с тем, как переведенный код C ++ пропустил Dynamic Исключение. Эквивалентный сгенерированный код C ++:

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();
}

3

Решение

Какие haxedefs вы определили?

Добавление их в ваш project.xml может помочь:

<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 uncaught error)

3

Другие решения

Я предполагаю, что это сводится к тому, как C ++ обрабатывает исключения с нулевым указателем. Это не так!

Больше информации Вот или же Вот

2

Это кажется странным, некоторые вопросы могут помочь в его решении.

  • Похоже, что вы делаете довольно некоторые предположения о том, как выглядит XML it.next()), это почему?
  • Почему вы используете этот блок с большой задницей?
  • Как выглядит getNodeNamed, кажется Можно вернуть null,
  • У вас есть пример xml для тестирования?
0
По вопросам рекламы [email protected]