【问题标题】:What class throws the exception in the end?到底哪个类抛出异常?
【发布时间】:2020-07-01 13:06:51
【问题描述】:

我有两种方法:

public void MethodOne() 
{

    try {
    MethodTwo();
    }
    catch (Exception ex) {
    Log.Message("Something went wrong);
    throw;
    }
}

public void MethodTwo()
{

    try {
    // Some logic that fails
    }
    catch (Exception ex) {
    throw ex;
    }
}

我从 MethodOne 调用 MethodTwo。如果在 MethodTwo 中抛出异常。程序会在异常处理完毕后终止,还是会冒泡到 MethodOne 并在那里被捕获?

【问题讨论】:

  • 为什么不直接用你的调试器试试呢?
  • 为了澄清,MethodTwo 不处理异常,它抛出它。实际上它会抛出一个没有原始堆栈跟踪的新的。如果你调试,你会看到它冒泡,然后你进入 MethodOne 的 catch 块。
  • 是什么阻止您按 F5 并尝试它?另外,如果应用程序在遇到第一个throw 时终止,您认为错误处理(例如日志记录)会发生什么情况?
  • 您可能会觉得这很有帮助:stackoverflow.com/questions/730250/…

标签: c# exception


【解决方案1】:

异常将在MethodTwo 中被捕获并重新抛出,然后在MethodOne 中再次捕获并重新抛出。

应用程序是否会终止取决于您调用MethodOne 的方式和位置,以及您在调用MethodOne 时是否捕获异常或在调用链中更进一步。

注意throw ex resets the stack trace 应该避免使用。

【讨论】:

    【解决方案2】:

    程序将在 MethodOne 中终止。

    您可以从这篇文章中了解更多。 Throw and Re-throw Exceptions in C#

    请注意,通过抛出异常会破坏堆栈跟踪信息!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-20
      • 2016-03-10
      • 2013-02-08
      • 1970-01-01
      • 1970-01-01
      • 2018-08-25
      • 1970-01-01
      相关资源
      最近更新 更多