C#尝试捕获和异常,并抛出确切的异常备份

时间:2019-03-28 03:14:16

标签: c# telemetry

很遗憾,我将对所有服务请求的遥测功能都整合到我的产品中,不幸的是,其中包括例外情况。我遇到的一个问题是我用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并将消息附加到该消息上,但是我宁愿传播回整个抛出的异常。

1 个答案:

答案 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;
}