首页 > 解决方案 > C# 尝试捕获和异常并抛出确切的异常备份

问题描述

我正在根据所有服务请求将遥测纳入我的产品中,不幸的是,这包括例外情况。我遇到的一个问题是我用 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 并将消息附加到它,但我宁愿将整个抛出的异常传播回去。

标签: c#telemetry

解决方案


如果您想做一些聪明/邪恶的事情,您可以使用when关键字来引入日志记录,而不会破坏异常的堆栈跟踪。

在 MSDN 上的 C# 参考中查看when contextual 关键字。它应该用作过滤器(该方法返回 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;
}

推荐阅读