2014-04-07 95 views
1

我以为我可以在我的项目中捕获另一个类抛出的异常,但我一定是做错了。在第一类中,我周围我打电话给其他类用try/catch块:另一个类抛出的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没有捕获异常?

+0

只是为了澄清你是说'ImportPowerPoint.CreateTitle'方法抛出没有被捕获的异常?因为它看起来应该捕获所有'FormatException'并显示你的消息框。 – Chris

+0

实际上,这可能很重要,实际的异常正在从'ImportPowerPoint.CreateTitle'调用的另一个类中抛出。我认为,无论异常发生在何处,无论是在立即调用的类中,还是从该类中调用的类,如果这是合理的,调用类将捕获该异常。 – Kevin

+0

如果该方法调用其他类的东西,那么catch应该仍然可以捕获。代码在其他类中的事实并不是问题(并且实际上通常是预料之中的,因为您经常捕获框架类中的异常而不是您自己的代码)。你肯定在这段代码中(并且它不会从代码中的其他地方抛出异常)? – Chris

回答

0

它在IDE中突然通知异常被抛出。如果再次按下F5继续运行,应该点击你的catch处理程序。

+0

这是事实,Theres是大多数IDE中的一个中断窗口,可以在程序中断时为您提供详细信息 – Jonny

+0

不幸的是,我的情况发生了什么:在我按F5键继续之后,它会再次弹出消息。我一遍又一遍地打F5,程序刚刚打开,弹出消息说'FormatException未被处理'。 – Kevin

+0

发生这种情况时调用堆栈是什么样的? - 是通过你的陷阱调用的投掷位置? –

0

没有什么与例外有关的类。您的调用代码(ImportPowerPoint.CreateTitle(...);)应该能够捕获由CreateTitle()引发的异常。

查看您的Visual Studio配置为捕获所有异常(不是只抓那些未处理):

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

您通常希望IDE捕获未处理的异常,所以我会保留另一列的选中状态。