在堆栈跟踪中写入信息

8

我能在堆栈跟踪中添加一些文本吗?

我的应用程序已经掌握了抛出的异常。但是希望对某些方法(参数)有更多信息。

想法是做类似于以下内容:

StackTrace.Insert (0, "argument:" + test);

我知道这不太酷,但是这是否可能呢?


这样是否足够?throw new InvalidOperationException("argument1:" + test + ", argument2:" + test2); - David Yaw
但这会停止我的方法,不是吗? - J. Lennon
4
解决方案是否可以是创建异常,并将参数放入[Data dictionary property](http://msdn.microsoft.com/en-us/library/system.exception.data(v=vs.100).aspx)中? (然后抛出异常...) - erikH
你的应用程序中是否有任何日志记录基础设施? - RQDQ
2
这里没有任何特定于WPF的内容。 - AlSki
3个回答

13

1
由于我的评论被投票为有用,而且我认为它更像是一个答案而不是一个评论,所以我将其作为答案。 - erikH
非常好。关键是要抛出这个新创建的异常,否则StackTrace将不会被填充。 - puddinman13

5

补充@erikH的出色答案:

除了使用Data属性外,如果您需要异常链中可用的其他数据,则可以通过自定义异常来实现。除了自定义类型可以提供的元信息(CommunicationException可能表示I/O问题,InvalidStateException可能表示程序遇到无效状态等),你可以以自定义字段的形式向异常添加附加信息。当您需要类型安全性而Data属性无法提供时,自定义字段特别有用。


2

根据定义,堆栈跟踪是程序中当前执行点处活动堆栈帧的输出,通常通过异常访问。

@David Yaw已经给出了向堆栈跟踪添加其他信息的正确方法,因为它会沿着异常堆栈向上传递。换句话说,只有在异常的结果时才应将自定义数据添加到堆栈跟踪中。

要么创建一些集中可访问的列表集合来存储日志数据,要么像David建议的那样使用适当的try/catch和异常冒泡。

例如。

try
{
  doSomethingThatMightFailAndThrowAnException();
}
catch (Exception ex)
{
  throw new Exception("Here is some custom data to add to the trace...",ex);
  // Notice adding the ex as the second parameter preserves the original exception trace
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接