Wykonałem kilka testów jednostkowych na kodzie, które mogą rzucić pewną liczbę wyjątków w zależności od danych wejściowych. Więc próbowałem coś podobnego poniższy kod: (uproszczony dla przykładu)Dlaczego nie mogę złapać ogólnego wyjątku w języku 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();
}
Ale to zawsze będzie drukować „Caught ogólny wyjątek”, tym catch (T tex) obsługi nigdy nie będzie działać. Nie ma znaczenia, czy rzucam T(), czy jawnie rzutuję ArgumentException(). Jakieś pomysły, dlaczego tak jest? Właściwie byłem trochę zaskoczony, że mogłem nawet użyć T w klauzuli catch, ale skoro jest to możliwe, czy nie powinno to działać? Lub przynajmniej dać ostrzeżenie/błąd kompilatora, który mówi, że ten handler nigdy nie zadziała?
Moje środowisko to Visual Studio 2008, a 3.5 to struktura docelowa.
AKTUALIZACJA: Próbowałem go teraz bezpośrednio z wiersza polecenia, a następnie wypisuje "Caught passed in exception type". Wygląda więc na to, że jest to ograniczone do działania z poziomu Visual Studio. Może cechą szczególną procesu hostingu Visual Studio?
Właśnie testowałem go w LINQPad i wydrukowany Caught przeszedł w rodzaju wyjątku. Czy możesz podać więcej szczegółów na temat środowiska i wersji ramowej. –
To interesujące. Uruchomiłem go jako aplikację konsolową w VS2008 i wydrukowano wyjątek Caught. –
Działa również w aplikacji SnippetCompiler –