[Забавно]Исключения-генерики
От: Красин Россия  
Дата: 25.10.06 03:51
Оценка: 47 (10)
Доброе утро, коллеги!

В .NET есть презабавнейшая вещь, как оказалось. А именно, можно выкидывать не только исключения, но и исключения generic-типа. Типа такого:
public class InvalidOperationException<T> : InvalidOperationException
{
}
...
public class SomeClass
{
   public static void DoSomething()
   {
     ...
     throw new InvalidOperationException<SomeClass>();
   }
}

В общем-то не сильно удивительный результат, т.к. выкидывать исключения можно любого типа-наследника System.Exception. Интересно другое — с появлением генериков C# приобрел возможность во время компиляции различать InvalidOperationException-ы, пришедшие из разных источников. При этом, не потеряна возможность сделать так:
try
{
   SomeClass.DoSomething();
}
catch (InvalidOperationException ex)
{ 
  //Делаем обработку, не зная, что нам кинули что-то более интересное, чем просто InvalidOperationException
}

Однако, в DoSomething возможно идет работа с вещами, которые тоже иногда выкидывают InvalidOperationException. Например, это может быть работа с сокетами, database provider, работа с коллекциями и т.д. Если нам захочется обработать именно то исключение, что возникло непосредственно в DoSomething (например, мы умеем на такой случай запасной вариант сделать то же самое, но медленнее или еще почему), то мы с легкостью можем сделать так:
try
{
   SomeClass.DoSomething();
}
catch (InvalidOperationException<SomeClass> ex)
{
  //Обработка исключения, возникшего непосредственно в DoSomething
}
catch (InvalidOperationException ex)
{
  //Обработка остальных InvalidOperationException-ов
}
catch (Exception ex)
{
  //Обработка всех прочих исключений
}

В общем-то это мы могли делать и без генериков. Действительно, кто мешает определить класс MyInvalidOperationException : InvalidOperationException и ловить его? Никто, кроме лени. Генерики позволяют выкидывать исключения более легковесно с точки зрения структуры программы. Другой положительный(?) момент — при таком подходе человек, читающий код, быстрее сможет понять, какая именно исключительная ситуация сейчас обрабатывается — ведь у типа исключения появился обратный адрес!

Минусы:

А вот еще есть косяки? Насколько можно использовать подобный подход в реальной жизни?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.