2014-02-20 60 views
0

我創建了一個DivisionByZero異常。 所以我期待捕獲異常INT捕捉(Execption前),但我捕捉異常的趕上(前的CommunicationException)wcf異常時的奇怪行爲

有消息稱例外。查看具體信息。 System.DivideByZeroException:嘗試除以零。

Service.YourClientProxy client = new Service.YourClientProxy(); 

try 
{ 
    client.DivisionByZeroException(); 
    client.Close(); 
} 
catch (CommunicationException ex) 
{ 
    client.Abort(); 
} 
catch (TimeoutException ex) 
{ 
    client.Abort(); 
} 
catch (Exception ex) 
{ 
    client.Abort(); 
    throw; 
} 

WCF服務

[OperationContract] 
[FaultContract(typeof(GeneralException))] 
public void DivisionByZeroException() 
{ 
    try 
    { 
     int a = 0; 
     int c = 1/a; 
    } 
    catch (Exception ex) 
    { 
     GeneralException exception = new GeneralException(ex.ToString()); 
     throw new FaultException<GeneralException>(exception, "Exception. See details.\n" + ex.ToString()); 
    } 
} 

[DataContract] 
public class GeneralException 
{ 
    public GeneralException(string message) 
    { 
     this.Message = message; 
    } 

    [DataMember] 
    public string Message { get; set; } 
} 

任何人都可以解釋爲什麼給我?

回答

0

我知道它應該是這樣的。

Service.YourClientProxy client = new Service.YourClientProxy(); 

try 
{ 
    client.DivisionByZeroException(); 
    client.Close(); 
} 
catch (FaultException ex) 
{ 
    client.Abort(); 
} 
catch (CommunicationException ex) 
{ 
    client.Abort(); 
} 
catch (TimeoutException ex) 
{ 
    client.Abort(); 
    throw; 
} 
0

當使用SOAP時,WCF通過線路發送故障。在客戶端API中,它們通過FaultException<T>(其中T是錯誤合同類型)公開,它從CommunicationException繼承。

所以你可以趕FaultException<GeneralException>

但是,如果你正在做的是用這個GeneralException對象封裝異常並將它們發送到客戶端,那麼就有一個內置的WCF機制。應用以下屬性爲您服務:

[ServiceBehavior(IncludeExceptionDetailInFaults = true)] 
class MyService 
{ 
    public void DivisionByZeroException() 
    { 
     int a = 0; 
     int c = 1/a; 
    } 
} 

從你的方法刪除try..catch塊。 WCF將自動捕獲異常並通過線路發送一個ExceptionDetail對象。因此,在您的客戶端代碼:

try 
{ 
    client.Exception(); 
    client.Close(); 
} 
catch (FaultException<ExceptionDetail> ex) 
{ 
    // handle it; ex.Detail contains the server exception data 
} 

請注意,這不是一個值得推薦的做法,因爲你暴露服務器堆棧跟蹤到客戶端。您可以聲明錯誤契約(可以是任何有效的數據契約,而不僅僅是異常對象),並將它們發送給客戶端,而不是發送異常。