提问人:Mykyta Butsenko 提问时间:3/22/2023 最后编辑:Mykyta Butsenko 更新时间:3/22/2023 访问量:51
如何重构我的方法,该方法返回值并可能引发异常?
How to re-factor my method which returns value and may throw exception?
问:
我有这个简单的方法,可以将一个对象添加到我的弹性索引中:
protected async Task<CreateResponse> AddAsync<T>(T entity, string id)
where T : class
{
var entityId = string.IsNullOrEmpty(id) ? Guid.NewGuid().ToString() : id;
var createResponse = await ElasticClient.CreateAsync(entity, c => c
.Index(_indexName)
.Id(new Id(entityId)));
if (createResponse.IsValid)
{
return createResponse;
}
HandleCreateResponseError<T>(entityId, _ => "Id", createResponse);
}
private void HandleCreateResponseError<T>(
string propertyName,
string id,
CreateResponse createResponse)
where T : class
{
Logger.LogError(
"An error occurred while adding {0} with {1} = {2}, see debug info: {DebugInformation}",
typeof(T).Name,
propertyName,
id,
createResponse.DebugInformation);
ThrowElasticException(createResponse);
}
private static void ThrowElasticException(IResponse response)
{
if (response.OriginalException != null)
{
throw response.OriginalException;
}
throw new ElasticsearchClientException(response.ServerError.Error.Reason);
}
所以,你可以在这里看到,如果无效,异常将被 100% 抛出。但是,Visual Studio给了我一个编译错误消息,上面写着.调用后如何在不添加的情况下重构我的方法?因为我觉得这样的回归太奇怪了。createResponse
Return statement is missing
AddAsync
return createResponse;
HandleCreateResponseError
避免此编译错误的唯一方法是添加语句,但恕我直言,它看起来很奇怪,因为我正在重写一个由于抛出异常而不会返回的值。return createResponse
答:
1赞
CodeCaster
3/22/2023
#1
只需将 :if
if (!createResponse.IsValid)
{
HandleCreateResponseError<T>(entityId, _ => "Id", createResponse);
}
return createResponse;
这样可以解决直接错误。现在您知道 之后,代码将不会继续。您可以通过标记方法来帮助分析器:HandleCreateResponseError()
[DoesNotReturn]
[DoesNotReturn]
private static void ThrowElasticException(IResponse response) { ... }
这不会影响编译器规则,即非 void 方法必须返回某些内容,但它将有助于控制流分析。
评论
0赞
Mykyta Butsenko
3/22/2023
谢谢,它奏效了。不知何故忘记了反转.在 SO 允许我这样做后,我会接受你的回答。不过,为什么需要这种反转呢?我的意思是,编译器无法继续看到异常将被 100% 抛出?if
1赞
CodeCaster
3/22/2023
不,因为编译器构建器将不得不解决 en.wikipedia.org/wiki/Halting_problem。
评论