【问题标题】:What if the catch statement code causes an error?如果 catch 语句代码导致错误怎么办?
【发布时间】:2014-12-15 22:22:14
【问题描述】:

我在我的应用程序中使用 Elmah 进行错误报告。

通常,如果我发现了错误,则制作自定义消息并再次将其返回。

catch (Exception ex)
{
    var e = new Exception("Failed to get Intake Statuses <br />" 
+ " (@PageNumber = " + pageNumber + ", @PageSize = " + pageSize + ".<br />" 
+ " Error: " + ex);

    ErrorLogger.LogErrorManually(e);

    throw new Exception(e.Message);
}

现在,如果我创建的自定义错误中有错误,就会出现问题。

处理该问题的最佳做法是什么?我要创建另一个子 Try/Catch 吗?

【问题讨论】:

  • LogErrorManually 容易被扔吗?也许它应该尝试/捕捉自己。否则,看起来你不需要担心它。如果你这样做了,再试一次/接住听起来是你最好的选择。
  • 抛出一个新的异常会导致你丢失堆栈跟踪。请考虑只使用throw;,或者抛出一个包含原始异常作为内部异常的新异常。
  • Do I created another nested Try/Catch loop? Try/catch 不是循环。这是一个声明。见try/catch C3 Reference
  • 而不是 throw new Exception(e.Message);,最好是使用 throw new YourOwnCustomException("Your Message", ex); 创建您自己的自定义异常,并将原始异常设置为内部异常,或者只使用 throw;使用所有信息重新抛出原始异常。你真的不应该扔掉基本的Exception 类,这被认为是一种不好的做法。
  • 如果你想避免嵌套的try/catch,你应该检查null。

标签: c# .net exception-handling elmah


【解决方案1】:

您可以执行以下操作:

  1. 使用 try catch 创建一个方法,比如 A,然后调用您在描述中给出的捕获为 B 的函数。
  2. 在您的 B catch 中,只需使用 throw,这样您的堆栈跟踪就不会消失。
  3. 在 B 捕获异常时,它将导航到捕获 A,因此您可以根据需要显示消息。

【讨论】:

  • 如果通过代码示例来解释会好很多。
  • 我花了一点时间阅读才能理解,但这是有道理的。一个代码示例对于任何偶然发现这个问题的人来说都是完美的。之后我会将其标记为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-18
  • 2022-06-11
  • 1970-01-01
  • 1970-01-01
  • 2022-06-11
  • 2020-07-02
相关资源
最近更新 更多