ABBYY FRE は COM オブジェクトです。GetEngineObject()
別の関数であることを除いて、通常の COM インターフェイス メソッドのように動作します。つまり、例外が外部に伝播することは許可されません。これを達成するために、すべての例外をキャッチし、それらを適切な値に変換しHRESULT
、場合によっては を設定しIErrorInfo
ます。
メソッド内でスローされた例外を分析しようとしても、問題が何であるかを見つけるチャンスはありません。これは、内部的に次のように機能する可能性があるためです。
HRESULT GetEngineObject( params )
{
try {
//that's for illustartion, code could be more comlex
initializeProtection( params );
obtainEngineObject( params );
} catch( std::exception& e ) {
setErrorInfo( e ); //this will set up IErrorInfo
return translateException( e ); // this will produce a relevant HRESULT
}
return S_OK;
}
void intializeProtection()
{
try {
doInitializeProtection();//maybe deep inside that exception is thrown
///blahblahblah
} catch( std::exception& e ) {
//here it will be translated to a more meaningful one
throw someOtherException( "Can't initialize protection: " + e.what() );
}
}
そのため、実際の呼び出しで例外をキャッチして変換し、意味のある診断を提供できます。診断を取得するIErrorInfo*
には、関数が戻った後に取得する必要があります。check()
そのためには、同じサンプル プロジェクトの関数のコードを使用します。例外がスローされるのをじっと見つめないでください。例外が発生する可能性はありません。例外が伝播して翻訳されるようにしてください。