2011-11-07 43 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,但沒關係,因爲我趕上一切吧?

的特定錯誤信息,我從Visual Studio中得到的是

KeyNotFoundException was unhandled by user code 

,而通常情況下,消息會說

KeyNotFoundException was unhandled 

如果調用不是反射調用。

我可以只是檢查方法,看看他們的鑰匙是否在那裏,如果沒有返回null,但使用異常處理似乎更可取。有沒有什麼方法可以從反射的方法調用中傳播異常?

+0

什麼是myMethod? –

+0

嗨Lucina,我只是劫持這個帖子,讓你知道,在TeX.SX,它通常是更好的自我回答,而不是刪除[你的問題](http://tex.stackexchange.com/q/255629/) 17423)。我很好奇什麼kaomoji看起來像TeX排版:)我確信其他人也是如此。我會在一天左右刪除這條評論(或者只要你讓我知道你已經看到它) - 我只是想讓你知道。 :) –

回答

3

這也可能是Visual Studio調試器的問題。正如在類似問題here的已接受答案中所指出的,您可以執行一些解決方法。其中最簡單的方法就是改變你的Visual Studio調試器,在Tools - > Options - > Debugging - > General中關閉「Just My Code」。你也可以把它包裝在一個委託中,或者明確地嘗試捕獲調用異常並檢查它的內部異常,這應該是你的KeyNotFoundException異常。

+1

重來最後 - 如果它不會'catch {}',那麼它也不會'catch(TargetInvocationException){}'' –

1

如果在使用反射調用方法期間發生錯誤,它應該拋出一個TargetInvocationException,它包裝(通過.InnerException)原始。然而,有一些方法可能會導致更多的終端失敗,比如圍繞winform創建/消息循環的一些方法。

也可能該方法是工作,但造成額外的工作,發生在另一個線程,它是是失敗的。這會殺死線程,並且你不能捕獲它,因爲它不在你的線程中。如果你的代碼實際上在一個工作線程上,這將是特別可能的。

3

它爲我的作品:

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!"); 
    } 
} 

注意,你需要捕捉TargetInvocationException這是Method.Invoke直接拋出,通過包裝方法本身拋出的異常的異常。

你能想出一個類似的簡短但完整的程序來演示問題嗎?