我目前在客户端程序中使用C#.NET服务。作为服务器设计的一部分,抛出了几个自定义异常以指示特定错误(如在任何普通桌面程序中)。
问题是Web Service捕获这些错误并将它们序列化为FaultException,并在Message字段中写入实际异常(如NoRoomsAvailableException)。
我的问题是,是否有处理这些错误的最佳做法。我们刚刚开始研究这个问题,我们可能会做一些文本模式匹配来提取异常类型和错误消息,但这似乎是一种hacky方式,所以任何“干净”的做法都会很多赞赏。
答案 0 :(得分:2)
正确的方法是定义故障合同。例如,在您的Web服务中,您可以执行以下操作:
[DataContract]
public class NoRoomsAvailableFaultContract
{
[DataMember]
public string Message { get; set; }
}
接下来,您为给定的服务操作声明此合同
[ServiceContract]
public interface IMyServiceContract
{
[OperationContract]
[FaultContract(typeof(NoRoomsAvailableFaultContract))]
void MyOperation();
}
你实现它是这样的:
public class MyService : IMyServiceContract
{
public void MyOperation()
{
if (somethingWentWrong)
{
var faultContract = new NoRoomsAvailableFaultContract()
{
Message = "ERROR MESSAGE"
};
throw new FaultException<NoRoomsAvailableFaultContract>(faultContract);
}
}
}
在这种情况下,NoRoomsAvailableFaultContract将在WSDL中公开,svcutil.exe可以生成代理类。然后你可以捕获这个例外:
try
{
myServiceProxy.MyOperation();
}
catch (FaultException<NoRoomsAvailableFaultContract> ex)
{
Console.WriteLine(ex.Message);
}
答案 1 :(得分:0)
其他平台可能会有所不同。我见过IBM的Rational Web Developer生成Java代理代码,为每个声明的错误创建一个单独的异常。那是Java泛型之前的一个版本,所以也许到现在它和.NET一样。