C# wcf异常时的奇怪行为

C# wcf异常时的奇怪行为,c#,.net,wcf,C#,.net,Wcf,我正在创建一个DivisionByZero异常。 因此,我希望在catch(Execption ex)中捕获异常,但在catch(CommunicationException ex)中捕获异常 信息显示异常。见详情。 System.DivideByZeroException:尝试除以零 Wcf服务 [OperationContract] [FaultContract(typeof(GeneralException))] public void DivisionByZeroException()

我正在创建一个DivisionByZero异常。 因此,我希望在catch(Execption ex)中捕获异常,但在catch(CommunicationException ex)中捕获异常

信息显示异常。见详情。 System.DivideByZeroException:尝试除以零

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; }
}
[运营合同]
[FaultContract(typeof(GeneralException))]
公共无效分区ByZeroException()
{
尝试
{
int a=0;
int c=1/a;
}
捕获(例外情况除外)
{
GeneralException exception=新的GeneralException(例如ToString());
抛出新的FaultException(异常,异常。请参阅详细信息。\n“+ex.ToString());
}
}
[数据合同]
公共类泛型异常
{
公共GeneralException(字符串消息)
{
this.Message=消息;
}
[数据成员]
公共字符串消息{get;set;}
}

谁能给我解释一下原因吗?

我知道应该是这样的

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;
}

当使用SOAP时,WCF通过线路发送故障。在客户端API中,它们通过
FaultException
(其中T是故障契约类型)公开,它继承自
CommunicationException

因此,您可以捕获
FaultException

但是,如果您所做的只是用这个
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
}
试试看
{
client.Exception();
client.Close();
}
捕获(FaultException-ex)
{ 
//处理它;例如,Detail包含服务器异常数据
}
请注意,这不是推荐的做法,因为您将向客户端公开服务器堆栈跟踪。您可以声明错误契约(可以是任何有效的数据契约,而不仅仅是异常对象)并将它们发送给客户机,而不是发送异常

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