Мне нужна точка зрения в этой конструкции, которую я предлагаю для обработки исключений.
У меня есть служба wcf, которая генерирует различные типы исключений ошибок:
- throw new FaultException (...)
- throw new FaultException (...)
- ...
- ...
Все эти классы исключений ошибок реализуют интерфейс IViolationFault, который имеет единственный метод HandleException,Реализация каждого такого метода различна в зависимости от класса, в котором они находятся;так, например, когда эти классы исключений попадают в клиент, все, что мне нужно сделать, это просто вызвать этот метод HandleException (), и об этом позаботятся, и мне не придется писать условие IF, чтобы различать типы ошибок.В методе HandleException () BusinessRuleViolationFault я мог бы просто захотеть показать сообщение на экране, в то время как в другом я мог бы захотеть зарегистрировать его где-нибудь и вызвать какое-то другое действие ...
catch (FaultException<BusinessRuleViolationFault> ex)
{
ex.HandleException();
}
catch (FaultException<SomeOtherViolationFault> ex)
{
ex.HandleException();
}
Вопросы
- Есть ли что-то неправильное в этом подходе?
- Есть ли способ уменьшить количество блоков перехвата и сделать так, чтобы всего один блок перехвата заботился обо всех типах исключений?
- Является ли это хорошим объектно-ориентированным способом для достижения полиморфизма при обработке исключений?
EDIT
Я изменил код для наследования от базыкласс вместо реализации интерфейса.Мой класс BusinessRuleViolationFault имеет метод HandleException, но я не могу получить метод HandleException в клиентском блоке перехвата.Что я делаю не так?Вот как его бросают в сервис
BusinessRuleViolationFault bf = new BusinessRuleViolationFault("");
throw new FaultException<BusinessRuleViolationFault>(bf, new FaultReason(new FaultReasonText("Fault reason here")));
Это мой код BusinessRuleViolationFault
[DataContract]
public class BusinessRuleViolationFault : BaseFault
{
public BusinessRuleViolationFault(string message)
: base(message)
{
}
[OperationContract]
public override string HandleException()
{
return "BusinessRuleViolationFault executed";
}
}
[DataContract]
public abstract class BaseFault
{
public BaseFault(string message)
{
Message = message;
}
[DataMember]
public string Message { get; set; }
[OperationContract]
public abstract string HandleException();
}
Позвольте мне высказать свои мысли по этому поводу.Спасибо за ваше время ...