提问人:Vietvo 提问时间:2/15/2023 更新时间:2/15/2023 访问量:94
C# 使用回调处理 API 异常?
C# Using callback for handling API exception?
问:
假设我的服务正在使用 NSwag 生成的代码使用第三方 API。目的只是调用 API,获取结果并跟踪/处理异常(如果有)作为下面的伪代码:
// Nswag generated code
class ApiClient: IApiClient
{
string GetData();
bool UploadData(data);
}
class Service1
{
IApiClient client;
ILogger logger;
void DoSth1()
{
try
{
var result = client.GetData();
} catch (Exception e)
{
HandleException(e); // additional logic
logger.Track(e);
}
}
}
class Service2
{
IApiClient client;
ILogger logger;
void DoSth2()
{
string result;
try
{
result = client.GetData();
} catch (Exception e)
{
HandleException(e); // additional logic
logger.Track(e);
}
HandleResult(result)
try
{
bool uploaded = client.UploadData(result);
} catch (Exception e)
{
HandleException(e); // additional logic
logger.Track(e);
}
}
}
这些代码实际上一遍又一遍地重复我的服务。我正在考虑将这些逻辑移动到新服务中的方法,然后使用回调处理错误,例如使用 GetData():
class ApiService: IApiService
{
IApiClient apiClient;
string GetData(Action onSuccess, Action<Exception> onFailure)
{
return Handle(() => apiClient.GetData(), onSuccess, onFailure);
}
T Handle<T>(Action apiCall, Action onSuccess, Action<Exception> onFailure)
{
T result;
try
{
result = apiCall();
}
catch (Exception e)
{
onFailure.Invoke(e);
}
onSuccess.Invoke();
return result;
}
}
class Service1
{
IApiService service;
ILogger logger;
void DoSth1()
{
var result = service.GetData(
onFailure: (Exception e) =>
{
HandleException(e);
logger.Track(e);
}
)
}
}
这种实现在我的服务中效果很好。
此实现的优点是:
减少尝试...在服务中捕获
集中 API 调用
对我来说,这似乎更干净。
缺点是关于引入新服务,我在 Service1、Service2 -IApiService 和 IApiService - IApiClient 之间获得了新的耦合。这就是我所能看到的。
我的问题:这是处理 API 结果/异常的好方法吗?我错过了哪些优点/缺点?
谢谢
答: 暂无答案
评论