Furion友好异常

一、一图流

在这里插入图片描述

二、注册友好异常服务

在 Furion 框架中,友好异常处理服务可以通过 AddFriendlyException 方法进行注册,这个方法通常在项目的启动配置中使用。

using Microsoft.Extensions.DependencyInjection;

namespace YourNamespace
{
    [AppStartup(800)] // 定义应用启动顺序
    public sealed class YourStartupClass : AppStartup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers()
                    .AddFriendlyException(); // 注册友好异常处理服务
        }
    }
}

注意AddFriendlyException() 方法需要在 services.AddControllers() 之后注册。

三、抛出友好异常

Furion 提供了 Oops.Oh 方法,允许开发者在代码中轻松抛出友好异常。Oops.Oh 可以接受不同的参数来定制异常信息。

示例1:简单抛出异常

using Furion.DynamicApiController;
using Furion.FriendlyException;

namespace YourNamespace
{
    public class YourAppService : IDynamicApiController
    {
        public int Get(int id)
        {
            if (id < 3)
            {
                throw Oops.Oh($"{id} 不能小于3");
            }

            return id;
        }
    }
}

示例2:抛出特定类型的异常

using Furion.DynamicApiController;
using Furion.FriendlyException;
using System;

namespace YourNamespace
{
    public class YourAppService : IDynamicApiController
    {
        public int Get(int id)
        {
            if (id < 3)
            {
                throw Oops.Oh($"{id} 不能小于3。", typeof(InvalidOperationException));
            }

            return id;
        }
    }
}

四、使用自定义异常信息

为了更好地管理和重用异常信息,可以使用枚举来定义异常信息,并通过 Oops.Oh 方法抛出这些自定义的异常。

创建异常信息枚举

using Furion.FriendlyException;

namespace YourNamespace
{
    [ErrorCodeType] // 标记枚举为错误代码类型
    public enum ErrorCodes
    {
        [ErrorCodeItemMetadata("{0} 不能小于 {1}")]
        InvalidId,

        [ErrorCodeItemMetadata("数据不存在")]
        DataNotFound,

        [ErrorCodeItemMetadata("{0} 发现 {1} 个异常", "系统", 2)]
        MultipleErrors,

        [ErrorCodeItemMetadata("服务器运行异常", ErrorCode = "Error")]
        ServerError
    }
}

使用自定义异常信息

using Furion.DynamicApiController;
using Furion.FriendlyException;

namespace YourNamespace
{
    public class YourAppService : IDynamicApiController
    {
        public int Get(int id)
        {
            if (id < 3)
            {
                throw Oops.Oh(ErrorCodes.InvalidId, id, 3); // 使用自定义错误代码
            }

            return id;
        }
    }
}

五、异常方法重试

在某些情况下,你可能希望对特定的操作进行多次尝试,直到成功或达到最大尝试次数。Furion 提供了 Retry.Invoke 方法来实现这一需求。

示例:异常方法重试

using Furion.FriendlyException;

public class YourService
{
    public void PerformOperation()
    {
        Oops.Retry(() => 
        {
            // 需要重试的操作
            DoSomething();
        }, retryCount: 3, delayMilliseconds: 1000); // 重试3次,每次间隔1秒
    }

    private void DoSomething()
    {
        // 可能抛出异常的代码
    }
}

六、全局异常处理提供器

Furion 提供了实现 IGlobalExceptionHandler 接口的方式,开发者可以通过此接口自定义全局异常处理逻辑,例如记录日志。

using Furion.DependencyInjection;
using Furion.FriendlyException;
using Microsoft.AspNetCore.Mvc.Filters;
using System.Threading.Tasks;

namespace YourNamespace
{
    public class LogExceptionHandler : IGlobalExceptionHandler, ISingleton
    {
        public Task OnExceptionAsync(ExceptionContext context)
        {
            // 在这里记录异常日志
            LogException(context.Exception);

            return Task.CompletedTask;
        }

        private void LogException(Exception exception)
        {
            // 记录异常到日志系统
        }
    }
}

七、配置异常信息文件

通过 appsettings.json 文件,可以动态配置异常信息,即使在运行时也可以方便地调整异常提示。

{
  "ErrorCodeMessageSettings": {
    "Definitions": [
      ["5000", "{0} 不能小于 {1}"],
      ["5001", "操作失败,请稍后重试"],
      ["5002", "Oops! 出错了"]
    ]
  }
}

使用配置的异常信息

using Furion.DynamicApiController;
using Furion.FriendlyException;

namespace YourNamespace
{
    public class YourAppService : IDynamicApiController
    {
        public int Get(int id)
        {
            if (id < 3)
            {
                throw Oops.Oh(5000, id, 3); // 使用配置文件中的5000异常码
            }

            return id;
        }
    }
}

八、自定义友好异常的其他功能

[IfException] 特性

如果需要覆盖默认的异常信息,可以使用 [IfException] 特性。

using Furion.DynamicApiController;
using Furion.FriendlyException;

namespace YourNamespace
{
    public class YourAppService : IDynamicApiController
    {
        [IfException(ErrorCodes.InvalidId, ErrorMessage = "自定义的错误信息:{0} 不能小于 {1}")]
        public int Get(int id)
        {
            if (id < 3)
            {
                throw Oops.Oh(ErrorCodes.InvalidId, id, 3);
            }

            return id;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰冰在努力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值