如果您希望将所有异常都转发给调用者, I3arnon 的回答很好,但如果您只希望通过一组有限的已知故障,您可以创建故障契约,让调用者知道一组特定的异常可能会通过所以客户可以准备好处理它们。这允许您传递潜在的预期异常,而无需将您的软件可能引发的所有异常转发给客户端。
这是 MSDN 中的一个简单示例,它显示了 WCF 服务捕获 aDivideByZeroException
并将其转换为 aFaultException
以传递给客户端。
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
//... (Snip) ...
[OperationContract]
[FaultContract(typeof(MathFault))]
int Divide(int n1, int n2);
}
[DataContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public class MathFault
{
private string operation;
private string problemType;
[DataMember]
public string Operation
{
get { return operation; }
set { operation = value; }
}
[DataMember]
public string ProblemType
{
get { return problemType; }
set { problemType = value; }
}
}
//Server side function
public int Divide(int n1, int n2)
{
try
{
return n1 / n2;
}
catch (DivideByZeroException)
{
MathFault mf = new MathFault();
mf.operation = "division";
mf.problemType = "divide by zero";
throw new FaultException<MathFault>(mf);
}
}