首页 > 解决方案 > 抛出异常或返回

问题描述

我有一个函数,我的控制器正在调用它来检查帐户是否有效。

我想知道在函数中返回的最佳设计是什么。抛出异常或返回错误消息会更好吗?

选项 1,我目前正在使用

public void ValidateLocalAccount(Login dto) {
     var user = _userService.GetUserByUsername(dto.username);
     if (user == null)
           throw new Exception("User does not exist");

     if (user.accountType != AccountType.Local)
           throw new Exception("Account is not local");
}

控制器:

[HttpPost("Login")]
public async Task<ActionResult> Login([FromBody] Login loginDto)
{
    try
    {
          _accountService.ValidateLocalAccount(loginDto);
          return Ok(await _accountService.GetToken(loginDto));
    }
    catch (Exception ex)
    {
          return BadRequest(ex.Message);
    }
}

选项2,这对我来说似乎不合常规

public <bool, string> ValidateLocalAccount(Login dto) {
     var user = _userService.GetUserByUsername(dto.username);
     if (user == null)
           return (false,"User does not exist");

     if (user.accountType != AccountType.Local)
           return (false,"Account is not local");

     return (true,string.empty);
}

控制器:

[HttpPost("Login")]
public async Task<ActionResult> Login([FromBody] Login loginDto)
{
     var res = _accountService.ValidateLocalAccount(loginDto);
     if(!res.item1)
        return BadRequest(res.item2)

     return Ok(await _accountService.GetToken(loginDto));
}

我是否会误用选项 1 中的异常,因为我有点用它来控制流程?因此我的问题是我应该何时选择异常而不是错误代码或返回 null ?哪个选项是更好的设计?干杯。

标签: c#asp.net-mvc

解决方案


失败的登录尝试绝不是例外,因此您不应在这种情况下使用例外。这就是 Eric Lippert 所说的令人烦恼的异常——所以我肯定会选择选项 #2。

如果您使用的是 C# 7.0 或更高版本,则可以返回一个值 tuple,因此您可以对其项目使用有意义的名称(而不是 System.Tuple 中的 Item1 和 Item2)。如果您使用的是早期版本的 c#,您可能希望返回您自己的结构或类,以便将来维护和代码可读性。


推荐阅读