【问题标题】:Best way to capture Full Stack Trace For Exception Inside Catch Block捕获块内异常的完整堆栈跟踪的最佳方法
【发布时间】:2020-12-14 20:10:26
【问题描述】:

我有一个用例,每当发生任何异常时,我都需要记录完整的堆栈跟踪以及所有详细信息以及行号。我看到有两种方法可以在这里使用Exception.ToString()Exception.Stacktrace,但我很困惑我应该使用哪一种?

另外,我看到很多 StackOverflow posts 和这个 article,人们在谈论使用 Ben.Demystifier 库或其他方式。

catch (Exception ex)
{
    Console.WriteLine(ex.Stacktrace);
    Console.WriteLine(ex.ToString());
    // using Ben.Demystifier library
    Console.WriteLine(ex.ToStringDemystified());
}

我只是想了解我们可以用来记录异常的完整堆栈跟踪的最佳和推荐方法是什么?

【问题讨论】:

  • 如果你不喜欢 ToString。使用某人简化了可以整理它的库。 “我只是想了解我们可以用来记录异常的完整堆栈跟踪的最佳和推荐方法是什么”没有推荐的方法,只有什么是可能的,什么是不可能的。这是一个选择你自己的冒险和你可以选择的人,而不是我们
  • 您一定看到 ex.Stacktrace 和 ex.ToString() 的结果之间的差异。您认为哪一个符合您的目的?

标签: c# exception


【解决方案1】:

例外?使用 Exception.StackTrace。

但是,需要注意的问题是,如果开发人员犯了这样的错误,一些堆栈跟踪信息可能会丢失:

try{ /* something errors */ }
catch(Exception ex)
{
    //do stuff
    throw ex;
}

...而不是重新抛出异常的适当方式:

try{ /* something errors */ }
catch(Exception ex)
{
    //do stuff
    throw; // <- no "ex"
}

前者只会记录从抛出点开始的堆栈跟踪。后者保留了原始异常的堆栈跟踪。

【讨论】:

    【解决方案2】:

    Exception.Stacktrace 将提供有关已执行的所有方法的详细信息以及行号。这有助于追溯错误的起源,但它不提供错误消息和其他详细信息。

    Exception.ToString 将提供当前异常、消息、对内部异常调用 ToString 的结果以及调用 Environment.StackTrace 的结果。所以肯定更详尽和详细。

    通过 Exception.ToString() 记录整个错误详细信息并在出现任何未处理的异常时相应地工作总是有帮助的。然后,如果需要,您可以根据您的要求提取它的堆栈跟踪。 但您需要再次了解您的要求才能在两者之间进行选择。

    您可以参考以下链接了解异常处理的最佳实践:

    1. https://docs.microsoft.com/en-us/dotnet/standard/exceptions/best-practices-for-exceptions
    2. https://stackify.com/csharp-exception-handling-best-practices/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-03
      • 2021-10-08
      • 1970-01-01
      • 2010-11-20
      • 2018-09-06
      • 2018-07-19
      相关资源
      最近更新 更多