使用Enterprise Library 5.0进行异常处理

时间:2011-05-02 12:33:28

标签: c# wcf enterprise-library

首先,我将解释我项目的结构:

我有一个WCF服务

public class MyService : IMyService
{
    private QueryHandler _queryHandler;

    public MyService()
    {
        _queryHandler = new QueryHandler();
    }

    public MyObject GetMyObject(string param1, string param2)
    {
        return _queryHandler.GetMyObject(param1, param2);
    }
}

QueryHandler-class位于不同的项目中,是我查询数据库的地方。

对于异常处理应用程序块采取哪种方法,我有点困惑: 我是否尝试了...查看queryhandler中的每个dataaccess代码并执行异常处理,如:

try
{
    //Do something
}
catch (Exception ex)
{
    ExceptionManager exManager = EnterpriseLibraryContainer.Current.GetInstance<ExceptionManager>();
    Exception exceptionToThrow;
    bool rethrow = exManager.HandleException(ex, "Exceptions Policy", out exceptionToThrow);

    if (rethrow)
    {
        if (exceptionToThrow == null)
        {
            throw;
        }
        else
        {
            throw exceptionToThrow;
        }
    }
    return null;
}

或者我把它放在我的webservice类中,如:

    public MyObject GetMyObject(string param1, string param2)
    {
        var exceptionManager = EnterpriseLibraryContainer.Current.GetInstance<ExceptionManager>();
        return exceptionManager.Process(() => _queryHandler.GetMyObject(param1, param2), "Exceptions Policy"); 
    }

1 个答案:

答案 0 :(得分:2)

由于您提到了WCF,因此您可以使用内置的[ExceptionShielding]属性来处理服务中的异常。

你最终会得到这样的东西:

[ServiceContract]
public interface IMyService
{
  [OperationContract]
  [FaultContract(typeof(FaultContracts.GetMyObjectFault))]
  MyObject GetMyObject(string param1, string param2);
}

[ExceptionShielding("GetMyObjectServicePolicy")]
public class MyService : IMyService
{
    private QueryHandler _queryHandler;

    public MyService()
    {
        _queryHandler = new QueryHandler();
    }

    public MyObject GetMyObject(string param1, string param2)
    {
        return _queryHandler.GetMyObject(param1, param2);
    }
}