C# wcf异常时的奇怪行为
我正在创建一个DivisionByZero异常。 因此,我希望在catch(Execption ex)中捕获异常,但在catch(CommunicationException ex)中捕获异常 信息显示异常。见详情。 System.DivideByZeroException:尝试除以零 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()
[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
}