在c#中记录exception

记录exception,这是用于在文本文件中记录exception的代码。 在这里,我只得到了错误的解释。

但它没有告诉我在哪一行发生exception。 任何onr告诉我怎么能实现这一点,以便我得到偶然发生的行号。

try { } catch (Exception ex) { Console.WriteLine(ex.Message); } #region WriteLogError ///  /// Write an error Log in File ///  ///  public void WriteLogError(string errorMessage) { try { string path = "~/Error/" + DateTime.Today.ToString("dd-mm-yy") + ".txt"; if (!File.Exists(System.Web.HttpContext.Current.Server.MapPath(path))) { File.Create(System.Web.HttpContext.Current.Server.MapPath(path)).Close(); } using (StreamWriter w = File.AppendText(System.Web.HttpContext.Current.Server.MapPath(path))) { w.WriteLine("\r\nLog Entry : "); w.WriteLine("{0}", DateTime.Now.ToString(CultureInfo.InvariantCulture)); string err = "Error in: " + System.Web.HttpContext.Current.Request.Url.ToString() + ". Error Message:" + errorMessage; w.WriteLine(err); w.WriteLine("__________________________"); w.Flush(); w.Close(); } } catch (Exception ex) { WriteLogError(ex.Message); } } #endregion 

我发现在C#中记录exception的最简单方法是调用ToString()方法:

 try { } catch (Exception ex) { Console.WriteLine(ex.ToString()); } 

这通常会为您提供所需的所有信息,例如错误消息和堆栈跟踪,以及任何额外的exception特定上下文信息。 (但请注意,如果使用调试信息编译应用程序,堆栈跟踪将仅显示源文件和行号)

然而值得注意的是,看到完整的堆栈跟踪对于用户来说可能是相当不合适的,因此只要有可能,您应该尝试处理exception并打印出更友好的错误消息。

另一方面 – 您应该使用function齐全的日志框架(例如Log4Net )替换方法WriteLogError而不是尝试编写自己的方法。

您的日志记录方法不是线程安全的(您的日志文件可能最终会将日志消息相互混合)并且如果您捕获exception,也绝对不应该调用自身 – 这将意味着在记录错误时发生的任何exception都可能导致难以诊断的StackOverflowexception。

我可以建议如何解决这些问题,但是使用适当的日志框架会更好。

只需记录ToString() 。 它不仅会为您提供堆栈跟踪,还会包含内部exception。

此外,例如,在将代码的发布版本部署到生产环境时,请不要忘记在发布包中包含.pdb文件。 您需要该文件来获取除外的代码的行号(请参阅pdb文件包含多少信息?(C#/ .NET) )