2

リポジトリからコントローラー レベルまでの例外とエラーを返す方法と、クライアントが Web サービスを呼び出したときにカスタム エラーをクライアントに返す方法を理解しようとしています。

私は私のBookRepositoryクラスから次の例を持っています:

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

明らかに、私の関数はこれよりも少し複雑になりますが、存在しない ID でこのメソッドを呼び出すと、例外が発生します。例外とカスタム エラーをコントローラーにバブルアップさせて、クライアントの応答に適切に表示するにはどうすればよいですか

4

3 に答える 3

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
    }
}
于 2013-03-05T19:00:03.360 に答える
1

edmastermind29 が言及したのは、それを行う一般的な方法の 1 つです。私は通常同じようにします。

ただし、開発者はコントローラーの前に例外をキャッチし、列挙値に基づいて結果メッセージを返したい場合があります。

outパラメータを使用してステータスを確認し、それに応じてユーザーにメッセージを表示できます。

これが、ASP.NET メンバーシップ プロバイダーの実装方法です。たとえば、メンバーシップ プロバイダーのメソッド create user を確認します。

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

于 2013-03-05T18:52:00.333 に答える
0

try-catch特定の状況 (null 値、空の値、無効な値など) によって失敗する可能性のあるメソッド、LINQ クエリなどを配置します。そこから、例外をキャッチし、探しているものに合わせたカスタム例外をスローできます。下記参照。

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";
   }
}
于 2013-03-05T18:31:10.127 に答える