2010-08-17 48 views

回答

0

您需要为此创建自定义例外。 请在这里阅读这篇文章:Why Create Custom Exceptions?

你正在开发哪种语言?

如果您需要进一步指导,请添加一些评论。

+0

我在C#开发。但是,我从服务中抛出的例外情况并没有达到使用该服务的客户端。 – Martinfy 2010-08-17 11:17:32

0

我不认为他想知道如何在.NET中抛出/捕获异常。

他可能想知道如何告诉客户端使用WCF数据服务时,在服务器(服务)端抛出/捕获异常时出现了什么(以及什么)出错。

WCF数据服务使用HTTP请求/响应消息,您不能仅从服务向客户端抛出异常。

3

你可以用这个属性ServiceBehaviorAttribute装饰你的服务类,像这样:

[ServiceBehavior(IncludeExceptionDetailInFaults=true)] 
public class PricingDataService : DataService<ObjectContext>, IDisposable 
{ 
    ... 
} 
10

有你需要做的,以确保在HTTP管道客户端异常泡沫的几件事情。

  1. 您必须属性您DataService类有以下几点:

    [ServiceBehavior(IncludeExceptionDetailInFaults =真)] 公共类MyDataService:DataService的

  2. 您必须启用配置详细的错误:

    public static void InitializeService(DataServiceConfiguration config) { config.UseVerboseErro rs = true; }

最好是内扔DataServiceException。 WCF数据服务运行时知道如何将属性映射到HTTP响应,并始终将其包装在TargetInvocationException中。

[WebGet] 
public Entity OperationName(string id) 
{ 
    try 
    { 
     //validate param 
     Guid entityId; 
     if (!Guid.TryParse(id, out entityId)) 
      throw new ArgumentException("Unable to parse to type Guid", "id"); 

     //operation code 
    } 
    catch (ArgumentException ex) 
    { 
     throw new DataServiceException(400, "Code", ex.Message, string.Empty, ex); 
    } 
} 

然后,您可以通过重写HandleException在你的DataService像这样解开这个客户端消费者:

/// <summary> 
/// Unpack exceptions to the consumer 
/// </summary> 
/// <param name="args"></param> 
protected override void HandleException(HandleExceptionArgs args) 
{ 
    if ((args.Exception is TargetInvocationException) && args.Exception.InnerException != null) 
    { 
     if (args.Exception.InnerException is DataServiceException) 
      args.Exception = args.Exception.InnerException as DataServiceException; 
     else 
      args.Exception = new DataServiceException(400, args.Exception.InnerException.Message); 
    } 
} 

更多信息,请参见here ...