很遗憾,我将对所有服务请求的遥测功能都整合到我的产品中,不幸的是,其中包括例外情况。我遇到的一个问题是我用try-catch包围了请求,如果成功,我将记录请求,如果有捕获,我将记录异常而不是抛出异常,以便使异常仍然传播,以便对其进行调试。我遇到的一个问题是,使用try-catch会丢失我的try-catch捕获的原始异常中的所有原始数据,我认为这样可以很好地传播回去。
public void someFunction(object data)
{
try
{
var response = await request(data);
LogInformation(request: data, response: response);
}
catch (Exception e)
{
throw HandleAndLogException(data, e);
}
}
private HttpResponseException HandleAndLogException(object data, Exception e)
{
LogException(data: data, response: e.Message);
var resp = new HttpResponseMessage(HttpStatusCode.BadRequest) {
Content = new StringContent(e.Message)
};
return new HttpResponseException(resp);
}
因此,正如您所看到的,我创建了一个新的HttpResponseException并将消息附加到该消息上,但是我宁愿传播回整个抛出的异常。
答案 0 :(得分:0)
如果您想做一些聪明/邪恶的事情,可以使用when
关键字引入日志记录,而不会破坏您的异常的堆栈跟踪。
请参见MSDN上C#参考中的when contextual keyword。应该将其用作过滤器(该方法返回true或false,指示是否应使用该catch块),但是您可以使用
我认为这是您想要的,尽管我尚未测试:
public void someFunction(object data)
{
try
{
var response = await request(data);
LogInformation(request: data, response: response);
}
catch (Exception e) when (HandleAndLogException(data, e))
{
throw;
}
}
private bool HandleAndLogException(object data, Exception e)
{
LogException(data: data, response: e.Message);
return true;
}