是否有人在抛出一个异常时存储数据?

时间:2016-02-17 16:12:05

标签: c# debugging logging

有几次堆栈跟踪不足以跟踪我想要的错误,并且如果我可以拥有导致异常的完全相同的数据,那么它将非常有用。所以我想知道将数据序列化为JSON并将其与我们已存储的其他信息一起存储在数据库中是否可以。我一直在四处寻找,但是甚至没有找到关于这件事的单一主题,所以我不知道这是一个好主意还是一个非常糟糕的主题。

我知道通过简单地阅读代码我能够找到缺陷但是使用有问题的数据调试它会更快。

2 个答案:

答案 0 :(得分:5)

是的,您通常有两种选择。

首先,异常具有.Data属性,用于添加自定义用户数据。您可以添加导致异常的数据,然后将异常序列化到数据库。在添加状态数据后,请务必使用throw;而不是throw ex;来“冒泡”您的异常,如果不这样做,则会破坏原始异常的堆栈跟踪。

public class MyClass
{
    public int Divide(int a, int b)
    {
        try
        {
            return a / b;
        }
        catch (Exception ex)
        {
            var aName = String.Join(".", typeof(MyClass).FullName, nameof(Divide), nameof(a));
            ex.Data[aName] = a;
            var bName = String.Join(".", typeof(MyClass).FullName, nameof(Divide), nameof(b));
            ex.Data[bName] = b;
            throw; //NOT throw ex;
        }
    }
}

其次,您可以针对特定案例制作user-defined exception,并将导致异常的数据包含为类的属性。

public int Divide(int a, int b)
{
    try
    {
        return a / b;
    }
    catch (Exception ex)
    {
        throw new MyLoggedException(a, b, ex);
    }
}

答案 1 :(得分:3)

我最担心的是数据隐私问题。用户相信我们的信息是安全存储的。通常,存在限制数据库访问数据的措施。但是,如果数据单独存储在不同的位置,则需要确保对日志跟踪具有相同的访问限制。

然而,如果隐私不是一个问题,我不会看到任何其他原因,这可能是一个坏主意。除了增加日志的大小。