【问题标题】:C++ re throw Exception gives errorC ++重新抛出异常给出错误
【发布时间】:2010-09-30 20:40:41
【问题描述】:

我正在尝试捕获“特定”异常(FormatException^ 或 OverflowException^),然后重新抛出它并在“一般”异常 (Exception^) 捕获块中捕获它。

运行时,我通过输入给它一个格式异常。然后我在一个对话框中得到这个错误: “FutureValue.exe 中发生了‘System.FormatException’类型的未处理异常 附加信息:输入字符串的格式不正确。” 当我单击“中断”时,它会将我带到第 232 行。

这里是部分代码:

try
{
...
}
catch(FormatException^ ex)
{
      MessageBox::Show("FormatException Occured.  Message: " + ex->Message);
      throw;
}
***line# 232*** catch(OverflowException^ ex)
{
      MessageBox::Show("Overflow Occured. Message: " + ex->Message);
      throw;
}
catch(Exception^ ex)
{
      MessageBox::Show("TESTING");
}

【问题讨论】:

  • 这不是 C++。可能是 C++/CLI?

标签: exception exception-handling c++-cli try-catch rethrow


【解决方案1】:

重新抛出表达式(throw without assignment_expression)导致最初抛出的对象被重新抛出。因为异常已经在重新抛出表达式发生的范围内被捕获,所以它被重新抛出到下一个动态封闭的 try 块。因此,在重新抛出表达式发生的范围内,它不能被 catch 块处理。

考虑到上述情况,您可能希望这样编写代码:

try
{
    try
    {
       //...
    }
    catch(FormatException^ ex)
    {
          MessageBox::Show("FormatException Occured.  Message: " + ex >Message);
          throw;
    }
    catch(OverflowException^ ex)
    {
          MessageBox::Show("Overflow Occured. Message: " + ex->Message);
          throw;
    }
}
catch(Exception^ ex)
{
      MessageBox::Show("TESTING");
}

【讨论】:

  • 哦,谢谢。呃。出于某种原因,我认为它会在它的 catch 块之后继续,而在它有机会捕获重新抛出的异常之后的 catch 块。我现在看到,重新抛出的异常在 try 块本身之后继续到任何后续的 try-catch 块。 ——
【解决方案2】:

上面有try catch块吗?

你刚刚用 throw 语句抛出了一个异常,没有人捕捉到它。 调试器已将您带到引发异常的位置

【讨论】:

  • 哦,谢谢。呃。出于某种原因,我认为它会在它的 catch 块之后继续,并且在它有机会捕获重新抛出的异常之后的 catch 块。
  • 我现在看到,重新抛出的异常在 try 块本身之后继续,到任何后续的 try-catch 块。
  • 其实我完全错了。你 retrhow 应该被外部 try / catch (Exception) 块捕获
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-10
  • 1970-01-01
  • 2012-06-29
相关资源
最近更新 更多