最佳实践的全局结果-Asp.Net Core 3和Angular 9中的错误处理

According to Microsoft's recommendation, throwing and catching should not be used for the normal logic of the program. Minimize exceptions

作为ASP.Net核心清洁体系结构项目(具有3层通用存储库-BL服务-控制器)的一部分,应如何设计和实现错误处理和结果? 是否应将结构或全局结果类用于所有Api控制器和BL服务? 如果错误和结果封装在结构中就足够了吗?

Web Api项目中的struct类的示例:

struct ExampleResult 
{
      public ExampleResult(T value, string message, bool success)
      {
         (...)
      } 
}

控制器:

public IActionResult Post([FromBody] NewResourceDto myNewResource)
{
    try
    {
         if(!Validate())
             return new ExampleResult(null, "some business logic validate failed", true);

        ExampleResult result = _service.TrySaveMyNewResource(myNewResource);
        return result;
    }
    catch (Exception ex)
    {
        // Log the exception here...
        return new ExampleResult(null, "some message" + ex, false);
    }
}

然后,Angular Client会验证该值是否为null和/或成功是true还是false。 该消息包含错误消息。 http状态将为200(无论成功与否)。

如何最大限度地减少例外?

评论
  • 君追
    君追 回复

    我同意,不应将抛出异常用作系统中的信号。也许我不明白您关于返回结构或全局结果类的问题。似乎是个坏主意。特别是,如果出现问题,请不要返回HTTP OK 200。

    • 使您的Web API控制器尽可能的薄
    • 将Web API控制器方法方法包装在try-catch中,以便在出现意外错误时始终返回HTTP Internal Server Error 500

    控制器方法示例:

    public IActionResult Post([FromBody] NewResourceDto myNewResource)
    {
        try
        {
            _service.TrySaveMyNewResource(myNewResource);
    
            return StatusCode(201);
        }
        catch (Exception ex)
        {
            // Log the exception here...
            return StatusCode(500);
        }
    }