Если бросание System.Exception
считается таким плохим, то почему не было Exception
сделано abstract
в первую очередь?
Таким образом, было бы невозможно позвонить:
throw new Exception("Error occurred.");
Это привело бы к использованию производных исключений для предоставления более подробной информации об возникшей ошибке.
Например, когда я хочу предоставить пользовательскую иерархию исключений для библиотеки, я обычно объявляю абстрактный базовый класс для своих исключений:
public abstract class CustomExceptionBase : Exception
{
/* some stuff here */
}
А потом какое-то производное исключение с более конкретной целью:
public class DerivedCustomException : CustomExceptionBase
{
/* some more specific stuff here */
}
Затем при вызове любого библиотечного метода можно было бы использовать этот общий блок try / catch для непосредственного перехвата любой ошибки, поступающей из библиотеки:
try
{
/* library calls here */
}
catch (CustomExceptionBase ex)
{
/* exception handling */
}
Это хорошая практика?
Было бы хорошо, если бы Exception
был сделан абстракция?
РЕДАКТИРОВАТЬ: Моя точка зрения здесь заключается в том, что даже если класс исключения отмечен abstract
, вы все равно можете поймать его в блоке всеобщего охвата. Делая это абстракция, это только способ запретить программистам создавать «сверхширокое» исключение. Обычно, когда вы добровольно выбрасываете исключение, вы должны знать, что это за тип и почему это произошло. Таким образом, принудительно выбрасывать более конкретный тип исключения.