2011-11-07 4 views
7

methodInfo.Invoke経由でメソッドを呼び出すときに、例外がスローされた場合、それは自分のcatchブロックまで伝播していないようです。cで反映されたメソッド呼び出しから例外が伝播しない#

object value; 
try 
{ 
    value = myMethod.Invoke(null, parameters);//program crashes with uncaught exception 
} 
catch 
{ 
    throw new Exception("Caught!");//never executed 
} 

この方法が上げている特定の例外はKeyNotFoundExceptionですが、私はすべて権利をキャッチしていますので、それは問題ではないでしょうか?

コールが反映呼び出しでなかった場合は、通常、メッセージは

KeyNotFoundException was unhandled 

を言うのに対し、私は、Visual Studioから取得する特定のエラーメッセージが

KeyNotFoundException was unhandled by user code 

です。

私はちょうど彼らがそこにキーがあるかどうかを確認するメソッドをチェックすることができますし、nullを返していない場合は例外処理を使用することが望ましいようです。反射メソッド呼び出しから例外を伝播する方法はありますか?

+0

myMethodとは何ですか? –

+0

こんにちはLucina、私はちょうどあなたのTeX.SXで、それは[あなたの質問](http://tex.stackexchange.com/q/255629/)を削除するより自己解決する方が良いことを知らせるためにこの投稿をハイジャックしています17423)。私は、カオモジがTeXによってタイプセットされるように見えるのは非常に興味がありました:)そして私は他人もそうだったと確信しています。私はこのコメントを1日ほどで削除します(またはあなたがそれを見たことを知らせるとすぐに) - 私はちょうどあなたに知らせたいと思っていました。 :) –

答えて

3

これはVisual Studioデバッガの問題でもあります。この類似の質問hereに受け入れられた回答に記載されているように、いくつかの回避策があります。最も簡単なのはVisual Studioデバッガを変更して、[ツール] - > [オプション] - > [デバッグ] - > [全般]の[Just My Code]をオフにすることです。また、デリゲートでラップするか、明示的に呼び出し例外をキャッチし、その例外を調べることができます。これはKeyNotFoundExceptionでなければなりません。

+1

最後に - もしそれが 'catch {}'でなければ、 'catch(TargetInvocationException){}'もしません –

1

リフレクションで呼び出されたメソッドでエラーが発生した場合、TargetInvocationExceptionがスローされ、(.InnerExceptionを介して)元のものがラップされます。しかし、winformの作成/メッセージループのようないくつかの方法のように、より多くの端末障害を引き起こす可能性のあるいくつかの方法があります。

この方法は作業ですが、追加の作業は別のスレッドで発生させ、それが失敗しているということであることも可能です。これはスレッドを殺すことになり、あなたのスレッド上にないので、それを捕まえることはできません。これは、コードが実際にワーカースレッド上にある場合に特にそうです。

3

は、それは私のために動作します:あなたは法自体によってスローされた例外をラップする、Method.Invokeによって直接スローされた例外があるTargetInvocationExceptionをキャッチする必要があります

using System; 
using System.Reflection; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var method = typeof(Program).GetMethod("ThrowException"); 
     try 
     { 
      method.Invoke(null, null); 
     } 
     catch (TargetInvocationException e) 
     { 
      Console.WriteLine("Caught exception: {0}", e.InnerException); 
     } 
    } 

    public static void ThrowException() 
    { 
     throw new Exception("Bang!"); 
    } 
} 

注意。

問題を示す同様の短くしかし完全なプログラムを考え出すことができますか?

関連する問題