try-catch用于记录目的?

时间:2016-01-20 12:04:10

标签: c# .net exception-handling try-catch

根据这个答案: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的有效使用吗?还是有其他建议的方法来记录它? (我不认为只记录这些信息(无论是否发生错误)都是有效的解决方案)

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

我认为你用

回答了你自己的问题
  

但是,记录在较高实例中不可用的信息

  

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

我不喜欢坚持和快速"总是做X而不是Y",因为有时候有必要违背所谓的"最佳实践"为了做你最好的应用程序。

如果需要记录信息以解决问题,并且如果您不立即记录该信息,则会丢失此信息,然后记录信息。

答案 2 :(得分:1)

来自你的链接问题:

  

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

我强调"基本的经验法则"因为它不是法律。这是一种最佳实践。即遵循它,直到你有充分的动力不这样做。

如果您捕获包含信息的异常,您可能应该抛出一个包含更多上下文信息的新的有意义的异常。类似的东西:

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

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

答案 3 :(得分:0)

  

但是如何记录更高级别的信息呢?   实例

您可以在重新抛出异常时将这些信息传递给调用者

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);
  }

}

答案 4 :(得分:0)

我们以您建议的方式使用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)并且用户没有获得黄色死亡屏幕,我们可以查看日志中任何错误的完整详细信息。