首页 > 解决方案 > 从 .NET Core API 返回有意义的错误消息

问题描述

设想

我有一个带有异常处理中间件的 .NET Core 2.2 Web API。每当应用程序(在 MVC 层内)发生异常时,它就会被异常中间件捕获并作为内部服务器错误返回到前端并记录到 kibana。

问题

当出现问题时,这一切都很好,但有时我想具体通知调用应用程序出了什么问题。即,“在数据库中找不到记录!” 或“无法将这个转换成那个!”

我的解决方案

我已经使用应用程序异常(不是很好 - 我知道)来捎带错误中间件以将其返回到前端。这一直工作得很好,但是由于不得不抛出一大堆异常而在代码周围产生了很多噪音。我对这种方法不满意,并坚信必须有更好的解决方案。

我的应用程序架构:我遵循传统的n 层应用程序布局,即服务(业务逻辑)和存储库(DAL)都相互通信。我希望在任何这些层中优雅地将任何问题反馈给用户。

我一直在考虑这个问题,但不确定最好的方法是什么。任何意见,将不胜感激。

标签: c#asp.net-coreerror-handlingasp.net-core-webapi

解决方案


我使用了一种运算结果模式(非官方模式)。

原理是返回一个新的类型,其中包含:

  • 手术是否成功。
  • 操作成功的结果。
  • 有关导致失败的异常的详细信息。

考虑以下类:

public class OperationResult
{
    protected OperationResult()
    {
        this.Success = true;
    }

    protected OperationResult(string message)
    {
        this.Success = false;
        this.FailureMessage = message;
    }

    protected OperationResult(Exception ex)
    {
        this.Success = false;
        this.Exception = ex;
    }

    public bool Success { get; protected set; }
    public string FailureMessage { get; protected set; }
    public Exception Exception { get; protected set; }

    public static OperationResult SuccessResult()
    {
        return new OperationResult();
    }

    public static OperationResult FailureResult(string message)
    {
        return new OperationResult(message);
    }

    public static OperationResult ExceptionResult(Exception ex)
    {
        return new OperationResult(ex);
    }

    public bool IsException()
    {
        return this.Exception != null;
    }
}

然后,您可以轻松地调整 OperationResult 或创建一个继承自 OperationResult 的类,但使用泛型类型参数。

一些例子:

  1. 操作结果模式——简单指南
  2. SOLID C# .NET 中的错误处理——操作结果方法

推荐阅读