我正在编写 MVC4 Web 应用程序。通常,我尝试将“try{}catch{}”块放在每个向用户返回 ActionResult 的控制器方法中。我这样做是为了捕获所有异常并显示适当的消息,因此用户永远不会看到类似的内容:
“引用未设置到对象的实例”
我的控制器通常如下所示:
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 单元测试框架),它将断言尚未激活其帐户的用户将无法登录。当检测到此类尝试时,我会抛出一个名为UserNotActivatedException的特殊异常。问题是——因为我在控制器中捕获了所有异常,所以我的测试本身永远不会真正看到这个异常——因此测试总是会失败。我设法通过为我的模型创建特殊状态枚举来绕过这个问题,如下所示:
public enum LoginViewModelStatus
{
NotLoggedIn = 0,
LoginSuccessfull = 1,
LoginFailed = 2,
UserNotActivatedException = 3,
UnknownErrorException = 100
}
并在发生某些事情时将其设置为某个值(所以当我捕捉到我的特殊 UserNotActivatedException - 我将loginModelStatus 设置为 UserNotActivatedException等等)
我的问题:
- 有没有更好的选择?
- 我也在考虑在其他控制器中使用这种设计,这里有什么缺点吗?
- 使用大量自定义异常来为用户显示消息是好的设计,还是使用更多的迷你 if(someCondition){return false;} 测试会更好?