2011-11-07 14 views
7

methodInfo.Invoke yöntemini çağırırken, bir özel durum atılırsa, yakalama bloklarım kadar yayılmıyor gibi görünmektedir. Ben herşeyi sağ biniyorum çünkü bu yöntem yükselttiğiniYansıyan bir yöntem çağrısından yayılmayan istisnalar C#

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

özellikle istisna KeyNotFoundException, ama bu önemli olmamalı? Çağrı yansıyan çağırma olmaması halinde normal mesaj

KeyNotFoundException was unhandled 

söyleyebilirim oysa

Ben Visual Studio aldığım belirli hata mesajı

KeyNotFoundException was unhandled by user code 

olduğunu.

Yalnızca anahtarın içeride olup olmadıklarını görmek için yöntem denetimine sahip olabilirim ve boş dönmezse, ancak istisna işlemeyi kullanma tercih edilir gibi görünüyor. Yansıyan bir yöntem çağrısından istisnaları yaymanın bir yolu var mı?

+0

myMethod nedir? –

+0

Merhaba Lucina, TeX.SX üzerinde, kendi sorunun cevabını (sorunuzu) silmek için genellikle daha iyi olduğunu bildirmek için bu gönderiyi ele geçiriyorum (http://tex.stackexchange.com/q/255629/ 17.423). Kaomoji'nin TeX :) tarafından dizilene benzeyeceği konusunda çok meraklıydım ve eminim ki diğerleri de vardı. Bu yorumu bir gün ya da daha sonra silerim (veya gördüğünüzü gördüğünüz andan itibaren) - Sadece size bildirmek istedim. :) –

cevap

3

Bu, Visual Studio hata ayıklayıcısında da bir sorun olabilir. Bu benzer soruya here kabul edilen yanıtta belirtildiği gibi, yapabileceğiniz birkaç geçici çözüm vardır. En basit olanı, Visual Studio hata ayıklayıcınızı, Araçlar -> Seçenekler -> Hata ayıklama -> Genel'deki "Sadece Kodum" u kapatmak için değiştiriyor. Ayrıca bir temsilci içine de sarın ya da açıkça bir davet istisnasını yakalamaya çalışın ve bunun KeyNotFoundException olması gereken iç istisnasını kontrol edin.

+1

Sonuncuyu tekrarla - eğer yakalamayacaksa {} ', sonra da yakalanamaz (TargetInvocationException) {} –

1

Yansıma ile çağrılan bir yöntem sırasında bir hata oluşursa, orijinali (.InnerException aracılığıyla) saran bir TargetInvocationException atmalıdır. Bununla birlikte, winform oluşturma/ileti döngüsü etrafında birkaç yöntem gibi daha fazla terminalin başarısız olmasına neden olabilecek birkaç yöntem vardır.

yöntem çalışan olmakla başka iş parçacığı üzerinde gerçekleşmesi için ek çalışma neden oluyor ve bu başarısız olduğunu olmasıdır olması da mümkündür. Bu iş parçacığı öldürür ve iş parçanızda olmadığı için yakalayamazsınız. Kodunuz aslında bir çalışan iş parçacığı olduğunda bu özellikle olasıdır.

3

Benim için çalışır: yöntemle kendisi tarafından atılan özel durum sarma, Method.Invoke doğrudan atılan istisna TargetInvocationException yakalamak gerekiyor

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

Not.

Sorunu gösteren benzer kısa ama eksiksiz bir program bulabilir misiniz?

İlgili konular