自己抛出异常时记录异常,而不是从异步方法抛出异常

时间:2016-10-14 07:01:18

标签: c# asp.net-web-api exception-handling async-await

考虑以下ASP.NET WebAPI控制器

public async Task Post(MyModel model)
{
    try
    {
        await _fooBarService.DoStuff(model.Input);
    }
    catch (Exception ex)
    {
        _logger.Error("Something happened! Whoah!", ex);

        var error = new HttpResponseMessage(HttpStatusCode.BadRequest);
        error.Content = new StringContent("Nice error message.");
        throw new HttpResponseException(error);
    }
}

调用类(_fooBarService)中的方法,如下所示:

public async Task DoStuff(string input)
{
    if (string.IsNullOrWhiteSpace(input))
        throw new ArgumentException("Cannot be null", nameof(input));

    var response = await _restClient.Put("uri", new BazRequest {input = input});

    if (response.StatusCode != HttpStatusCode.OK)
    {
        _logger.Error("Something awful happened.");
        throw new HttpResponseException(response);
    }
}

如果我提供空的input,并且抛出ArgumentException,则记录器将其拾取并按预期正确记录。但是,如果_restClient抛出异常,则错误记录。但是,最终用户仍然会收到“Nice错误消息”字符串,这确实意味着代码块已执行。

如果我尝试捕获并记录_restClient内的内容,则会按预期附加日志。

我认为这与异步和等待的Put(..)方法有关,但我无法确切地理解为什么因为异常来自哪里,所以执行catch块的其余部分。< / p>

对于它的价值,_logger只是一个非常薄的log4net包装。

任何?

0 个答案:

没有答案