一、一图流

二、注册友好异常服务
在 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;
        }
    }
}
                


















