从Web API中的存储库级别返回错误的好方法

时间:2013-03-05 18:29:30

标签: c# web-services exception-handling asp.net-web-api

我试图找出如何从我的存储库返回控制器级别的异常和错误,并能够在调用我的Web服务时将自定义错误返回给客户端。

我的BookRepository课程中有以下示例:

public BookViewModel GetBookById(Guid id)
{
      var Book = _Books.Collection.Find(Query.EQ("_id", id)).Single();
      return Book;
}

显然我的函数会比这复杂一点,但如果我在一个不存在的id上调用这个方法,我会得到一个例外。如何将我的异常和自定义错误冒泡到我的控制器,然后在客户端响应中很好地显示

3 个答案:

答案 0 :(得分:3)

就异常处理而言,即使是Web服务也应遵循与任何其他代码相同的模式。这些最佳实践包括不使用自定义异常,除非调用者将根据异常类型进行编程选择。所以,

public BookViewModel GetBookById(Guid id)
{
    try
    {
      var Book = _Books.Collection.Find(Query.EQ("_id", id)).Single();
      return Book;
    }
    catch (SpecificExceptionType1 ex)
    {
        Log.Write(ex);
        throw new Exception("Some nicer message for the users to read", ex);
    }
    catch (SpecificExceptionType2 ex)
    {
        Log.Write(ex);
        throw new Exception("Some nicer message for the users to read", ex);
    }
    catch (Exception ex)
    {
        Log.Write(ex);
        throw;  // No new exception since we have no clue what went wrong
    }
}

答案 1 :(得分:1)

edmastermind29提到的是一种常见的方法。我通常会以同样的方式。

但有时开发人员喜欢在控制器之前捕获异常并返回基于枚举值的结果消息,因此控制器没有尝试catch块用于该调用,它只需要检查状态消息。 / p>

您可以使用 out 参数来检查状态并相应地显示用户的消息。

这是ASP.NET成员资格提供程序的实现方式。 检查方法创建用户在成员资格提供程序中的例如:

http://msdn.microsoft.com/en-us/library/system.web.security.membershipprovider.createuser(v=vs.100).aspx

答案 2 :(得分:0)

在方法,LINQ查询等周围放置一个try-catch,在给定情况下可能会失败(空值,空值,无效值等)。从那里,您可以捕获异常,并根据您的需求调整自定义异常。见下文。

public BookViewModel GetBookById(Guid id)
{
   try
   {
      var Book = _Books.Collection.Find(Query.EQ("_id", id)).Single();
      return Book;
   }
   catch (Exception e)
   {
      Log.Write(e)
      status = "Some Custom Message";
   }
   catch (DoesNotExistException dne)
   {
      Log.Write(dne)
      status = "Some Custom Message about DNE";
   }
}