如何重构我的方法,该方法返回值并可能引发异常?

How to re-factor my method which returns value and may throw exception?

提问人:Mykyta Butsenko 提问时间:3/22/2023 最后编辑:Mykyta Butsenko 更新时间:3/22/2023 访问量:51

问:

我有这个简单的方法,可以将一个对象添加到我的弹性索引中:

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给了我一个编译错误消息,上面写着.调用后如何在不添加的情况下重构我的方法?因为我觉得这样的回归太奇怪了。createResponseReturn statement is missingAddAsyncreturn createResponse;HandleCreateResponseError

避免此编译错误的唯一方法是添加语句,但恕我直言,它看起来很奇怪,因为我正在重写一个由于抛出异常而不会返回的值。return createResponse

C# asp.net .NET ASP.net-core 异常

评论

0赞 Pablo Recalde 3/22/2023
否定 If,将你的处理代码放在里面,在 if 之后返回。

答:

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