考虑以下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包装。
任何?