2016-04-16 23 views
1

Delphiやfpcでネストされた例外処理については、多くのことが言及されています。例えばthisのようなものです。多分、ネストされたtry...ブロックの必要性を解決することを私の質問、コードの以下の2つのバージョン間の実際の差がある場合は未定義の動作や何かがexpectまたはfinally後に発生した場合で、私は以外の任意のが表示されません...最終的にはDelphiで試してみてください。

try 
    StrToInt('AA'); 
finally 
    writeln('I absolutely need this'); 
end; 
writeln('and this'); 

と...

try 
    StrToInt('AA'); 
except 
end; 
writeln('I absolutely need this'); 
writeln('and this'); 

答えて

8

はいDIFがありますference。巨大なもの。

tryブロックに例外がない場合、両方のバージョンですべてのコードが実行されますが、例外動作が異なる場合は、すべてのコードが実行されます。

コードの最初のバージョンでは、ブロック以降のものは実行されず、例外は次のレベルに伝播されます。第二のバージョン例外で

try 
    StrToInt('AA'); // if this code throws exception and it will 
finally 
    writeln('I absolutely need this'); // this line will execute 
end; 
writeln('and this'); // this line will not execute 

通常の実行を継続する次のexceptブロックとコードによって処理されます。リンク質問に

try 
    StrToInt('AA'); // if this code throws exception and it will 
except 
end; 
writeln('I absolutely need this'); // this line will execute 
writeln('and this'); // this line will also execute 

あなたは例外ブロックを入れ子にしており、その状況は、それがその質問への答えで説明したように、異なった1以上よりも動作します。


ドキュメント:Delphi Exceptions

+0

は、ドキュメントでそれを見ていません。だから、 'try..finally'ブロックでは、' finally'が終了すると関数から飛び出し、 'if * 'と' try'の間に例外が発生した場合にのみ**飛びます。これをクリアしていただきありがとうございます。 – Vassilis

+0

これは文書化されています。あなたは何を読んでいる? –

+0

これはどういう意味ですか? "例外が発生したがfinally節で処理されなかった場合、**その例外**はtry ... finally文から伝播されます..."。私はこの議論が私の悪い英語の結果ではないことを願っています! – Vassilis

関連する問題