MVC4 Web アプリケーションを作成しています。通常、ユーザーに ActionResult を返すすべてのコントローラー メソッド内に「try{}catch{}」ブロックを配置するようにしています。すべての例外をキャッチして適切なメッセージを表示するためにこれを行うので、ユーザーには次のようなものは表示されません。
「参照がオブジェクトのインスタンスに設定されていません」
私のコントローラーは通常次のようになります。
try
{
}
catch(MyFirstCustomException ex)
{
//set some message for the user and do some cleaning etc.
return ActionResult();
}
catch(MySecondCustomException ex) (and so on...)
{
//set some message for the user and do some cleaning etc.
return ActionResult();
}
catch(Exception ex)
{
//set some message for the user and do some cleaning etc.
return ActionResult();
}
ただし、次のような状況になりました: AccountControllerとLogInメソッドがあり、(Microsoft Unit Testing Framework を使用して) 単体テストを作成したいのですが、アカウントをアクティブ化していないユーザーは、ログインします。そのような試みが検出されたときにスローされるUserNotActivatedExceptionという名前の特別な例外があります。問題は、コントローラー内ですべての例外をキャッチするため、テストで実際にこの例外自体が表示されることはなく、テストが常に失敗することです。次のようなモデルの特別なステータス列挙型を作成することで、問題を回避することができました。
public enum LoginViewModelStatus
{
NotLoggedIn = 0,
LoginSuccessfull = 1,
LoginFailed = 2,
UserNotActivatedException = 3,
UnknownErrorException = 100
}
そして、何かが起こっているときに特定の値に設定することによって(そのため、特別な UserNotActivatedException をキャッチすると、 loginModelStatus を UserNotActivatedExceptionに設定するなど)
私の質問:
- これに代わるより良い方法はありますか?
- このデザインを他のコントローラーでも使用することを考えていますが、何か欠点はありますか?
- ユーザーにメッセージを表示するために多くのカスタム例外を使用するのは良い設計ですか?それとも、より多くのミニ if(someCondition){return false;} テストを使用する方がよいでしょうか?