你怎麼看待這種做法:自定義異常處理和客戶
故障幫手:
[Serializable]
public class WcfHwServiceFault
{
private readonly Guid _guid;
private readonly byte[] _data;
private WcfHwServiceFault(Guid guid, byte[] data)
{
_guid = guid;
_data = data;
}
public static WcfHwServiceFault Create(Exception ex)
{
var formatter = new SoapFormatter(null, new StreamingContext(StreamingContextStates.CrossMachine));
var ms = new MemoryStream();
formatter.Serialize(ms, ex);
return new WcfHwServiceFault(ex.GetType().GUID, ms.GetBuffer());
}
public Exception Get()
{
var formatter = new SoapFormatter(null, new StreamingContext(StreamingContextStates.CrossMachine));
var ms = new MemoryStream(_data);
return (Exception)formatter.Deserialize(ms);
}
}
服務器端應用:
try
{
...
}
catch (Exception ex)
{
throw new FaultException<WcfHwServiceFault>(WcfHwServiceFault.Create(ex));
}
客戶端使用情況:
try
{
Channel.DoSomeMethod(...);
}
catch (FaultException<WcfHwServiceFault> ex)
{
throw ex.Detail.Get();
}
catch (CommunicationException ex)
{
throw new ApplicationException("Communication error.", ex);
}
這是什麼意思?你爲什麼使用'ApplicationException'?你不知道你不再使用它嗎?另外,你使用運行時序列化的原因是什麼?如果異常不是可序列化的呢?你有沒有真正想解決的問題? – 2010-09-03 02:33:53
2 PostMan:此代碼是可編譯和可運行的: catch(FaultException ex) throw ex.Detail.Get(); } catch(CommunicationException ex) { }拋出新的ApplicationException(「Communication error。」,ex); } –
SeeSharp
2010-09-03 03:11:30
2 John Saunders: 1.客戶端通過通用接口使用業務邏輯並使用適當的異常(本地)集合。 2.然後我們通過wcf添加代理,但客戶端像以前一樣使用相同的接口和異常。 3.所有業務邏輯的異常都是可序列化的,但我想你會問很多問題。謝謝。 PS對不起,如果我的英文不太清楚。 – SeeSharp 2010-09-03 03:26:17