用于日志记录目的的尝试捕获

本文关键字:用于 记录 日志 | 更新日期: 2023-09-27 18:31:05

根据这个答案:https://stackoverflow.com/a/1722991/680026只有当你真的在那里一些除了日志记录之外的事情时,你才应该使用 try-catch:

如果您只打算记录异常并且把它扔到堆栈上。它没有任何意义,并且使代码混乱。

但是,记录在更高级别不可用的信息呢?例如:

private void AddSomethingToTable(string tablename, string fieldname) {
  try {
    InsertFieldToTable(tablename, fieldname);
  } catch (Exception ex) {
    log.ErrorFormat("Could not insert field '{0}' into table '{1}'", fieldname, tablename);
    throw;
  }
}
private void main() {
  try {
    AddSomethingToTable("users","firstname");
    AddSomethingToTable("users","lastname");
    AddSomethingToTable("users","age");
  } catch (Exception ex) {
    MessageToUser("Sorry. Saving did not work.",ex);
  }
}

如您所见:在我的(完全编造的)示例中,我记录了有关导致错误的字段的信息。这可能是开始查找错误的一些好信息。

因此,即使我只记录了错误,这些信息也可能至关重要,并且在该方法之外丢失。

这是在这里有效使用 try-catch 还是有其他建议的方法来记录它?(我不认为总是记录此信息(无论是否发生错误)将是一个有效的解决方案)

用于日志记录目的的尝试捕获

我想

你回答了你自己的问题

但是,记录在更高实例上不可用的信息呢?

此信息可能至关重要,并且在该方法之外会丢失

我不喜欢"总是做X,从不做Y",因为有时有必要违背所谓的"最佳实践",以便做最适合您的应用程序的事情。

如果记录信息

是解决问题所必需的,并且如果不立即记录此信息,则会丢失此信息,请记录信息。

你想做的事情没有错。另一个问题/答案的想法是,最好将错误记录在真正处理错误的地方。在 .NET 中,每个异常都包含一个堆栈跟踪。这意味着上层可以报告生成此错误的代码中的位置。在一个地方而不是在多个地方这样做更有意义。这是他们的主意。

从您链接的问题:

捕获异常的基本经验法则是捕获异常,当且仅当您有有意义的方法来处理异常时。

我强调"基本经验法则",因为它不是法律。这是最佳做法。即遵循它,直到你有很好的动机不这样做。

如果捕获异常以包含信息,则可能应该抛出包含更多上下文信息的新有意义的异常。 像这样:

try 
{
    //kldfsdölsdöls
}
catch (Exception ex)
{
    throw new MoreDetailedException("Text with context data", ex);
}

这样,您将获得收集到同一异常中的每个堆栈级别的所有上下文信息(因为您在其中包含了内部异常)。因此,顶层的日志条目将在同一行中包含所有信息。

但是,如果记录在更高位置不可用的信息呢? 实例?

您可以在重新引发异常时将这些信息传递回调用方

private void AddSomethingToTable(string tablename, string fieldname) {
  try {
    InsertFieldToTable(tablename, fieldname);
  } catch (Exception ex) {
    string str = string.Format("Could not insert field '{0}' into table '{1}'", fieldname, tablename);
    throw new Exception(str, ex);
  }

}

我们以您建议的类似方式使用 Try Catch 块,它对我们来说效果很好。我们已经实现了ELMAH https://code.google.com/p/elmah/它非常适合记录未捕获的错误。通过 Try Catch 块中的一行代码,您还可以将捕获的异常写入日志。

Catch ex As Exception
            Elmah.ErrorSignal.FromCurrentContext.Raise(ex) 
            Return False
 End Try
错误

已处理(相关函数返回 false),用户没有获得黄屏死机,我们可以在日志中查找任何错误的完整详细信息。