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