我正在开发的一个程序有一个名为“Error”的日志记录函数,用于通知错误而不会使程序崩溃,但是,我想包含一个堆栈跟踪,以便可以更轻松地调试这些非致命错误。我的第一反应是使用
System.Diagnostics.StackTrace
,遗憾的是 PCL 中不提供该功能。
然后,我尝试抛出并立即捕获异常。
try { throw new Exception(); }
catch (Exception ex) { return ex.StackTrace; }
不幸的是,这仅提供了调用堆栈的顶部:因为它不会在向下的过程中解开堆栈,所以它不会提供任何有用的信息。所以,我的问题是这样的:如何在 c# PCL 函数中获取堆栈跟踪而不抛出错误并在堆栈底部捕获它?我更愿意将代码完全保留在 PCL 中并避免使用抽象以及平台特定的实现代码,用于如此琐碎的事情。
编辑作为对评论的响应:` throw new Exception(ex) 仅向堆栈跟踪添加另一层,因此堆栈跟踪函数中有两行,但仍然无法检索完整跟踪。
在某些
PCL
配置文件中,Environment.StackTrace
属性可用,并且在执行当前方法时,它会获取调用堆栈上帧的字符串表示形式。这是一种获取堆栈跟踪而不引发异常的更简单方法。
像这样得到它:
string stackTrace = Environment.StackTrace;
否则,您也可以手动添加
Console.WriteLine(ex.StackTrace)
或将其添加到记录器。