Azure Service Fabric远程处理框架异常处理

时间:2017-04-21 10:22:15

标签: exception-handling azure-service-fabric remoting

我有一个Azure Service Fabric无状态服务,客户端通过ServiceProxy连接到远程服务,我试图捕获客户端服务中引发的异常。在线文档说:

  

远程处理框架将在服务处抛出的异常传播到   客户端。所以在客户端使用异常处理逻辑   ServiceProxy可以直接处理服务抛出的异常。

但是,我似乎得到的是一个System.Exception,其中包含一些其他错误消息,例如:

  

类型异常   ' ExceptionServiceCommon.Exceptions.MyCustomException'被扔了。

我正在使用一个严肃的回归实现,以便在更复杂的情况下解决这个问题。

服务代码是:

internal sealed class ExceptionService : StatelessService, IException
{
    public ExceptionService(StatelessServiceContext context)
        : base(context)
    { }

    public Task ThrowException()
    {
        throw new MyCustomException();
    }

    protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
    {
        return new[]
        {
            new ServiceInstanceListener(initParams => this.CreateServiceRemotingListener(initParams))
        };
    }
}

公共程序集中定义的接口和异常是:

public interface IException : IService
{
    Task ThrowException();
}

[Serializable]
public class MyCustomException : Exception
{
    public MyCustomException()
    { }

    public MyCustomException(string message)
        : base(message) { }

    public MyCustomException(string message, Exception innerException)
        : base(message, innerException)
    { }

    protected MyCustomException(SerializationInfo info, StreamingContext context) 
        : base(info, context)
    {
    }
}

客户端(控制台应用程序)中的代码是:

class Program
{
    static void Main(string[] args)
    {
        var client = ServiceProxy.Create<IException>(new Uri("fabric:/ExceptionApplication/ExceptionService"));

        try
        {
            client.ThrowException().GetAwaiter().GetResult();

        }
        catch (MyCustomException)
        {
            Console.WriteLine("My Custom Exception");
        }
        catch (Exception)
        {
            Console.WriteLine("Plain old Exception");
        }

        Console.Read();
    }
}

MyCustomException永远不会被捕获,只有Exception。

1 个答案:

答案 0 :(得分:0)

您没有在客户端获取异常的原因是它包含在downloader/request_count': 11 crawlera/request/method/GET': 11 httpcache/hit': 11 中。只需确保在try / catch中捕获它,然后handle自定义异常类型。

AggregateException