【问题标题】:Catch exception thrown by another class?捕获另一个类抛出的异常?
【发布时间】:2014-04-07 12:55:35
【问题描述】:

我以为我可以在我的项目中捕获另一个类引发的异常,但我一定是做错了。在第一堂课中,我用 try/catch 块包围了我对另一堂课的调用:

try
{    
    ImportPowerPoint.CreateTitle(textBoxPpt.Text, textBoxPkg.Text);
}
catch (FormatException ex)
{
    MessageBox.Show(ex.Message, "ERROR",
    MessageBoxButtons.OK,
    MessageBoxIcon.Warning);
}

在第二类中,这是我抛出异常的地方:

if (!_layoutMap[(int)Layouts.A].ContainsValue(Fields.Title))
    throw new FormatException("Standard (A) Layout does not contain a title.");

if (!_layoutMap[(int)Layouts.A].ContainsValue(Fields.Txt1))
    throw new FormatException("Standard (A) Layout does not contain a txt1.");

if (!_layoutMap[(int)Layouts.A].ContainsValue(Fields.Prompt))
  throw new FormatException("Standard (A) Layout does not contain a prompt.");

当我运行程序时,它会在抛出异常的地方立即中断,而不是显示我在 try/catch 块中定义的错误窗口。我没有正确处理这个 try/catch 吗?

为了澄清,我通过从我正在解析的 PowerPoint 中删除某些部分来强制发生异常。例如,当程序失败时,因为我删除了Title 字段,抛出的异常类型为 FormatException。我在调用类中的catch 不应该处理这个吗?

编辑:我想我可能已经发现了导致这种情况发生的原因。抛出的异常在另一个线程中。那么,既然它在另一个线程中,这是否意味着这就是我的 try/catch 没有捕获异常的原因?

【问题讨论】:

  • 只是为了澄清你是说ImportPowerPoint.CreateTitle 方法抛出了未被捕获的异常吗?因为看起来它应该捕获所有FormatExceptions 并显示您的消息框。
  • 实际上,这可能很重要,实际异常是在另一个从ImportPowerPoint.CreateTitle 调用的类中引发的。我在想,无论异常发生在哪里,无论是在立即调用的类中,还是从该类调用的类中,调用类都会捕获异常,如果这有意义的话。
  • 如果该方法调用其他类的东西,那么 catch 应该仍然可以捕获。代码在其他类中的事实不是问题(实际上通常是预期的,因为您经常在框架类中捕获异常,而不是您自己的代码)。您确定在这段代码中(并且它没有从代码中的其他地方抛出异常)吗?
  • 您可能需要检查您在外部类中捕获的异常的 InnerException 属性。

标签: c# exception-handling


【解决方案1】:

在 IDE 中中断以通知抛出异常。如果您再次按 F5 继续运行,您的 catch 处理程序应该会被命中。

【讨论】:

  • 这是真的,大多数 IDE 中都有一个中断窗口,可以在程序中断时为您提供详细信息
  • 不幸的是,在我的情况下发生的事情是,在我按 F5 键继续之后,它只是再次弹出消息。我一遍又一遍地按 F5,程序就中断了,弹出消息说“FormatException 未处理”。
  • 发生这种情况时调用堆栈是什么样的? - 是否通过您的陷阱调用了投掷位置?
【解决方案2】:

没有任何与类相关的异常。您的调用代码 (ImportPowerPoint.CreateTitle(...);) 应该能够捕获 CreateTitle() 抛出的异常。

查看您的 Visual Studio 是否配置为捕获所有异常(而不是仅捕获未处理的异常):

  1. 转到“调试”菜单
  2. 选择“例外...”
  3. 取消选中“Thrown”列下的复选框

您通常希望 IDE 捕获未处理的异常,因此我会检查另一列。

【讨论】:

    【解决方案3】:

    这里的问题似乎是因为这是一个多线程程序。我正在考虑使用AppDomain.UnhandledException Event 来处理我的异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-24
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      相关资源
      最近更新 更多