3

私は、StartElement イベント ハンドラからスローされた例外が、expat parser(in C) を使用するアプリケーションによってキャッチされない理由を理解しようと懸命に努力していました。すべての catch ブロックが配置されているにもかかわらず、アプリケーションは catch ブロックが見つからないと言って終了します。私自身のイベント ハンドラーから例外がスローされているため、expat の XML_Parse API は、すべての catch ブロックがあるコードにそれを渡すことができません。「Michael Anderson」という名前の stackoverflow ユーザーの 1 人が、expat lib が例外を処理するようにするために必要な gcc フラグを使用して、expat lib を再構築することを提案しました。開始要素、終了要素など

登録したイベント ハンドラーで例外が発生した場合、XML_Parse API が 0 を返すようにしたいと考えています。助けてください。前もって感謝します。

コードは次のとおりです。

try 
{  
   if( ! XML_Parse(.....) )
   {
        throw exception;
   }
}
catch(...)
{
}

実際のシナリオでは、XML_Parse が不正な形式の xml ファイルに遭遇した場合、即座にゼロを返し、if ブロックに入って例外をスローすると、問題なくキャッチされます。しかし、問題のあるケースでは、イベント ハンドラーから例外がスローされていますが、私のアプリケーションはコアをダンプし、コア スタックは、キャッチが見つからないことを示し、最後に std::terminate を呼び出して中止します。では、イベント ハンドラーからユーザー定義の例外をスローしたい場合、XML_Parse がゼロを返すようにするにはどうすればよいでしょうか。

4

1 に答える 1

2

expat.h に従って、解析を中止する必要があるエラーがハンドラーで発生した場合は、 XML_StopParser(parser, 0) を呼び出す必要があります。

XML_Parse は XML_FALSE を返します。その時点で、アプリケーション固有のエラー処理を呼び出すことができます

于 2014-02-27T21:22:53.737 に答える