Причина не маркировки исключения как абстрактного - PullRequest
1 голос
/ 28 марта 2019

Microsoft Лучшая практика говорит:

Ввод нового класса исключений только в том случае, если предопределенный класс не применяется.

И

Когда требуется специальное исключение, присвойте ему соответствующее имя и выведите его из класса Exception.

Извлечение из класса Exception имеет смысл, поскольку это позволяет нам обрабатывать определенные исключения и (например) регистрировать и выдавать остальное:

try
{
    //something that might throw exceptions
}
catch(InvalidOperationException)
{
    //Do something
}
catch(Exception ex)
{
    //Log and throw other exception
    throw;
}

Я не могу придумать причину, по которой можно создать экземпляры базового класса Exception. Итак, почему исключение не помечено как абстрактный класс?

Я думал, что перехват абстрактного исключения может вызвать некоторое специальное поведение, но, похоже, это не так:

public abstract class AbstractException : Exception
{

}

public class MyException : AbstractException
{

}

//...

try
{
   throw new MyException();
}
catch (AbstractException)
{
   //Works fine
}

Ответы [ 2 ]

2 голосов
/ 28 марта 2019

Абстрактные классы требуются только , обязательны , если есть абстрактные члены.Exception не имеет таковых, поэтому не требует , чтобы быть абстрактным.

Но Microsoft может сделать его абстрактным, чтобы соответствовать их собственным лучшим практикам.Что ж, передовой опыт не стоит на месте, поэтому у разработчика должен быть выбор отклониться от него.Неабстрактный Exception предоставляет такую ​​возможность.

1 голос
/ 28 марта 2019

Есть много случаев, когда вам не нужна какая-либо специальная или дополнительная информация, чтобы «описать» исключительную ситуацию в вычислительном потоке.Тип Exception очень подходит для таких ситуаций, так что вам не нужно определять новые типы для общих исключительных ситуаций.Будучи абстрактным типом, Exception не позволит вам создать его экземпляр, и вам придется изобретать некоторые общие типы исключений из проекта в проект, чтобы иметь тип исключения, «понятный» всем потребителям высокого уровня (то естьпредоставить возможность всем потребителям отлавливать и обрабатывать все исключения независимо от специализации типа исключения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...