Если вы просто используете общее исключение, вы никогда не сможете перехватывать определенные исключения, которые являются пользовательскими для вашего приложения. Если вы просто используете
try
{
}
catch (Exception ex)
{
}
Вы будете ловить каждое исключение, не имея возможности отфильтровать определенные ошибки.
Еще одна причина, по которой я создаю пользовательское исключение, заключается в обработке особых исключений приложения, которые могут возникать по многим причинам. Это означает, что вы хотите создать пользовательское исключение, но настроить сообщение, связанное с этим исключением. Это также дает мне другой уровень обработки ошибок для моего конкретного приложения.
Например, у меня есть приложение enigineering, которое определяет размеры систем ременного привода. DLL также доступна для использования другими людьми. У меня есть исключение приложения, которое выбрасывается при возникновении ошибки в выборе. Причиной ошибки может быть множество причин (неправильная скорость привода, неправильные требования к лошадиным силам и т. Д.). Поскольку существует множество причин сбоя, исключение из пользовательского приложения позволяет мне предоставить конкретные сведения об ошибке.
Это также позволяет мне документировать пользователям, что вызовы методов будут генерировать специфичные для приложения исключения, которые они должны обработать.
Если ваш наследующий класс Exception убедитесь, что в базовом классе реализованы конструкторы, которые имеют сообщение, сообщение + внутреннее исключение и сериализованное исключение.
Вот пример, который у меня есть.
/// <summary>
/// Drive error exception class. Thrown when a drive selection error has occured.
/// </summary>
[Serializable]
public class DriveException : ApplicationException
{
/// <summary>
/// Default constructor.
/// </summary>
public DriveException()
{
}
/// <summary>
/// Constructor used with a message.
/// </summary>
/// <param name="message">String message of exception.</param>
public DriveException(string message)
: base(message)
{
}
/// <summary>
/// Constructor used with a message and an inner exception.
/// </summary>
/// <param name="message">String message of exception.</param>
/// <param name="inner">Reference to inner exception.</param>
public DriveException(string message, Exception inner)
: base(message, inner)
{
}
/// <summary>
/// Constructor used in serializing the data.
/// </summary>
/// <param name="info">Data stored to serialize/de-serialize</param>
/// <param name="context">Defines the source/destinantion of the straeam.</param>
public DriveException(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
}