Каковы отраслевые стандартные рекомендации по реализации пользовательских исключений в C#?
каковы стандартные рекомендации по внедрению пользовательских исключений в C#?
Я проверил Google и есть большое количество рекомендаций, однако я не знаю, какие из них имеют больше доверия.
Если у кого-нибудь есть ссылки на авторитетные статьи, это также было бы полезно.
4 ответа:
стандарт для создания пользовательских исключений является производным от исключение. Затем вы можете ввести свои собственные свойства/методы и перегруженные конструкторы (если применимо).
вот основной пример пользовательского
ConnectionFailedException
который принимает дополнительный параметр, специфичный для типа исключения.[Serializable] public class ConnectionFailedException : Exception { public ConnectionFailedException(string message, string connectionString) : base(message) { ConnectionString = connectionString; } public string ConnectionString { get; private set; } }
в приложении это может быть использовано в сценариях, где приложение пытается подключиться к базе данных например,
try { ConnectToDb(AConnString); } catch (Exception ex) { throw new ConnectionFailedException(ex.Message, AConnString); }
это до вас, чтобы затем обрабатывать
ConnectionFailedException
на более высоком уровне (если применимо)Смотрите также Разработка Пользовательских Исключений и Пользовательские Исключения
Я предполагаю, что вы ищете методы обработки исключений. Так что смотрите на следующие статьи,
http://msdn.microsoft.com/en-us/library/ms229014.aspx / / дает общие представления об исключениях, включая пользовательские исключения
вот код для создания пользовательского исключения:
using System; using System.Runtime.Serialization; namespace YourNamespaceHere { [Serializable()] public class YourCustomException : Exception, ISerializable { public YourCustomException() : base() { } public YourCustomException(string message) : base(message) { } public YourCustomException(string message, System.Exception inner) : base(message, inner) { } public YourCustomException(SerializationInfo info, StreamingContext context) : base(info, context) { } } }
Смотрите также: http://www.capprime.com/software_development_weblog/2005/06/16/CreatingACustomExceptionClassInC.aspx
Я использую пользовательские исключения для передачи характера ошибки.
например, мне нравится использовать фреймворк, предоставленный "ArgumentNullException" для проверки аргументов. Затем позже, когда я вижу эту ошибку либо в отладчике, либо в журнале ошибок, я сразу же узнаю природу ошибки, не читая дальше.
другой конец спектра-это исключение InvalidOperationException, которое может означать практически все.
альтернатива custom исключений подробные сообщения об ошибках. Это нормально, но создание пользовательского исключения, такого как ConnectionFailed, более значимо. Тогда само сообщение может дать более подробную информацию.
при создании таких пользовательских исключений я не добавляю никаких новых свойств. Причина этого заключается в том, что если у вас есть регистратор ошибок, вы хотите, чтобы он работал на всех исключениях. Если вы добавляете специальное свойство, то регистратор ошибок будет игнорировать его. Например, если вы используете MSTest, при выполнении теста и это не удается, пользовательские свойства не отображаются. Но если вы придерживаетесь свойства Message базового класса, он будет отображаться просто отлично.
таким образом, подкласс очень прост:
public class NavigationException : Exception{ public NavigationException() {} public NavigationException(string msg) : base(msg) {} public NavigationException(string msg, Exception inner) : base(msg, inner) {} }
Это очень просто, работает с любым регистратором ошибок, и когда я вижу его, я знаю, что это была проблема навигации, и я могу просмотреть детали, если это необходимо.
Грег