Я использую пользовательские исключения, чтобы сообщить природу ошибки.
Например, мне нравится использовать платформу ArgumentNullException для проверки аргументов.Затем позже, когда я вижу эту ошибку либо в отладчике, либо в журнале ошибок, я сразу же узнаю природу ошибки, не читая дальше.
Другой конец спектра - исключение InvalidOperationException, которое может означатьпочти все.
Альтернативой пользовательским исключениям являются подробные сообщения об ошибках.Это нормально, но создание пользовательского исключения, такого как ConnectionFailed, более целесообразно.Тогда само сообщение может дать более подробную информацию.
При создании таких пользовательских исключений я не добавляю никаких новых свойств.Причина этого в том, что если у вас есть регистратор ошибок, вы хотите, чтобы он работал на все исключения.Если вы добавите специальное свойство, то регистратор ошибок будет игнорировать его.Например, если вы используете MSTest, когда вы запускаете тест, и он не проходит, пользовательские свойства не отображаются.Но если вы придерживаетесь свойства Message базового класса, оно будет отображаться просто отлично.
Таким образом, подклассы очень просты:
public class NavigationException : Exception{
public NavigationException() {}
public NavigationException(string msg) : base(msg) {}
public NavigationException(string msg, Exception inner) : base(msg, inner) {}
}
Это очень просто, работает с любым регистратором ошибоки когда я вижу это, я знаю, что это была проблема с навигацией, и я могу просмотреть детали, если это необходимо.
Грег