2017-11-20 18 views
0

にcatch句に落ちる、私はあなたのような保護されたブロックで例外をスローすることによってcatchハンドラを入力することができますことを承知しています制御をcatch節に移してください。 は例外をポップします。CILでtryブロックについてはCIL

私の関心事(/好奇心)は、これが最適化できるかどうかで、実行は がスローされるのではなく、PCをインクリメントしてcatchブロックに移動することです。このようなもの:

try { 
    newobj Exception 
} catch { 
    pop 
    ldstr "catchblock" 
    call WriteLine 
} finally { 
    ldstr "finallyblock" 
    call WriteLine 
} 

EX1: 

これは有効なCILですか? throw文を使用せずにcatchハンドラブロックに到達することは可能ですか?

答えて

1

いいえ、明示的に無効です。 I、セクション12.4.2.8.1 ECMA-335パーティション内

:フィルタまたはハンドラに

エントリのみCLI例外システムを介して達成することができます。つまり、制御がそのようなブロックに入るのは有効ではありません。これは、フィルタとハンドラがメソッドの開始時に表示されないこと、または制御フローが停止する可能性のある命令の直後に表示されないことを意味します。

+0

これは私が理解しているのは、ハンドラに渡すことができないということですが、 'leave'命令は省略することができます。コントロールはtryブロックの最後まで落ちます。 –

+0

@ TitianCernicova-Dragomir私はそれが可能であるかどうかわからないのですか?最後の命令は、仕様で定義されている分岐元の規則によって分岐することはできません。だから、最後の命令は休暇でなければなりません。私は思う... – Nick

+0

非常にブライアン、これは非常に美しいニュースですありがとうございます – Nick

関連する問題