最佳实践的全局结果-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(无论成功与否)。

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