2009-10-16 20 views
39

Bazı birimlerde, girişlere bağlı olarak bir dizi istisna atabilecek bir sınama birimi testi yapıyordum. Bu yüzden aşağıda kodu gibi bir şey denedim: (örneğin basitleştirilmiş)Neden C# genel bir özel durum yakalayamıyorum?

static void Main(string[] args) 
    { 
     RunTest<ArgumentException>(); 
    } 

    static void RunTest<T>() where T : Exception, new() 
    { 
     try 
     { 
      throw new T(); 
      //throw new ArgumentException(); <-- Doesn't work either 

     } 
     catch (T tex) 
     { 
      Console.WriteLine("Caught passed in exception type"); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("Caught general exception"); 
     } 
     Console.Read(); 
    } 

Ama bu her zaman işleyicisi asla işe yaramayacak "yakalandı genel istisna", yakalamak (T tex) basar. T() atmak mı, yoksa ArgumentException() 'ı açıkça atamak fark etmez. Bunun neden olduğu hakkında bir fikrin var mı? Aslında yakalama maddesinde bile T'yi kullanabileceğime şaşırdım, ama bu mümkün değil mi? Ya da en azından bu işleyicinin hiçbir zaman çalışmayacağını söyleyen bir derleyici uyarısı/hatası verilsin mi?

Ortamım Visual Studio 2008 ve 3.5 hedef çerçeve.

GÜNCELLEME: Şimdi doğrudan komut isteminden denedim ve sonra "Yakalanan özel durum türünde" yazdırır. Yani bu, Visual Studio'nun içinden çalışmaya kısıtlanmış gibi görünüyor. Belki Visual Studio barındırma sürecinin bir tuhaflığı?

+1

daha ayıklayıcısında çalıştırmaya yapmak için daha fazla ve o istisna tipi geçirilen yakaladım çıktısı. Ortam ve çerçeve versiyonunuz hakkında daha fazla bilgi verebilir misiniz? –

+2

Bu ilginç. VS2008'de bir konsol uygulaması olarak koştum ve Caught genel istisna yazdı. –

+0

Ayrıca SnippetCompiler –

cevap

32

Tuhaf davranışlar burada ...

VS2k8 konsol uygulaması. Aşağıdaki: "yakalandı genel istisna" yılında

try 
{ 
    throw new T(); 
} 
catch (T tex) 
{ 
    Console.WriteLine("Caught passed in exception type"); 
} 
catch (Exception ex) 
{ 
    Console.WriteLine("Caught general exception"); 
} 

sonuçlanır.

Ama yakalamak açıklamalarından (yararsız) değişkenleri kaldırın: içinde

try 
{ 
    throw new T(); 
} 
catch (T) 
{ 
    Console.WriteLine("Caught passed in exception type"); 
} 
catch (Exception) 
{ 
    Console.WriteLine("Caught general exception"); 
} 

sonuç "istisna tipinde geçti yakalandı" !!!


Güncelleme:

Heheh ... Onun bir hata: https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=362422&wa=wsignin1.0

Kaynağı? İşte. Why does catch(TException) handling block behaviour differ under the debugger after installing Visual Studio 2008?

2

istisna, en belirgin tip verildiğinde gibi görünüyor T ve İstisna arasındaki seçim, istisnadır ve işleyici çalıştırılır.

Bunu denedim (bunu C# veya VB'de yapamazsınız, ancak IL'yi düzenledim) ve ikinci yakalama özelliğini Exception Ex yerine Object Ex'i yakalamak için değiştirdi ve bu durumda ilk işleyici çarptı.

Düzenleme

Diğerleri işaret gibi, ben sadece LINQPad bunu Test edilen belirli tip