我需要一個在這個設計中的觀點,我提出處理異常。通過多態的異常處理
我有拋出不同類型的故障異常的WCF服務:
- 拋出新的FaultException < BusinessRuleViolationFault>(...)
- 拋出新的FaultException < SomeOtherViolationFault>(...)
- ...
- ...
所有這些故障excep tion類實現了一個叫做IViolationFault的接口,它有一個HandleException方法。每個這樣的方法的實現取決於它們所處的類別而不同;所以例如當這些異常類在客戶端中被捕獲時,我所需要做的就是調用HandleException()方法,並且不需要編寫IF條件來區分這些類型的錯誤。在BusinessRuleViolationFault的HandleException()方法,我可能只是想在屏幕上顯示的消息,而在另外一個我可能要到什麼地方登錄,並引發一些其他的動作,以及...
catch (FaultException<BusinessRuleViolationFault> ex)
{
ex.HandleException();
}
catch (FaultException<SomeOtherViolationFault> ex)
{
ex.HandleException();
}
問題
- 這個 方法有什麼不對嗎?
- 有沒有一種方法可以減少catch塊的數量 並且只需要一個catch塊來處理所有異常類型?
- 這是一個很好的面向對象的方式來處理異常時獲得多態嗎?
EDIT
伊夫改變了代碼以從基類繼承,而不是實施的接口。我的BusinessRuleViolationFault類具有HandleException方法,但我無法獲取客戶端catch塊中的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();
}
不要讓我有你的這個想法。感謝您的時間...
爲什麼在異常上使用泛型?它如何讓生活更輕鬆? – 2011-06-14 08:01:08
@Yves M.這個問題被標記爲_wcf_。在WCF中使用['FaultException'](http://msdn.microsoft.com/zh-cn/library/ms576199.aspx)是實現錯誤合同的方式。 –
2011-06-14 10:27:48
'[DataContract]內的'[OperationContract]'是毫無意義的。你真的需要閱讀WCF基礎知識 - 抱歉。 – 2011-06-14 15:59:52