Stavo eseguendo alcuni test di unità sul codice che potevano generare una serie di eccezioni a seconda degli input. Così ho provato qualcosa di simile il codice qui sotto: (semplificato per l'esempio)Perché non riesco a rilevare un'eccezione generica in C#?
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();
}
ma questo sarà sempre stampare "Preso un'eccezione generale", il catch (T tex) gestore non funzionerà mai. Non importa se lancio T() o lancio esplicitamente ArgumentException(). Qualche idea del perché questo? In realtà sono stato un po 'sorpreso dal fatto che ero persino in grado di usare T nella clausola catch, ma dato che è possibile non dovrebbe funzionare? O almeno dare un avvertimento/errore del compilatore che dice che questo gestore non funzionerà mai?
Il mio ambiente è Visual Studio 2008 e 3.5 è il framework di destinazione.
UPDATE: l'ho provato ora direttamente dal prompt dei comandi e poi viene stampato "Caught passed in exception type". Quindi sembra che questo sia limitato all'esecuzione da Visual Studio. Forse una peculiarità del processo di hosting di Visual Studio?
ho appena provato in LINQPad e stampato Caught passato nel tipo di eccezione. Puoi fornire maggiori dettagli sul tuo ambiente e sulla versione del framework. –
È interessante. L'ho eseguito come app per console in VS2008 e ha stampato un'eccezione generale Caught. –
Funziona anche in app SnippetCompiler –