尝试..捕捉不使用不同项目中的表单。适用于调试,而不是发布

时间:2013-08-02 20:06:27

标签: c# visual-studio-2005

所以,我有这种情况:

解决方案

  • - 项目A
    -FrmA
  • - 项目B
    -FrmB

我的主要应用程序在项目A中,在这个FrmA表单中,有一个方法可以在一个try..catch中在一个项目B内部实例化并调用FrmB上的方法,这个FrmB在第二次尝试中有一个抛出... catch块可以捕获异常,但不会将其丢回到frmA catch块。 像这样:

FrmA:

try{
 frmB.show();
}catch(Exception ex){
  //Do things
}

FrmB_onLoad():

try{
 object.method(); //method which generates the Exception 
}catch(Exception ex){
  throw ex; //which should go to frmA method
}

现在,最有趣的是,当它在Visual Studio上处于调试模式或发布模式时,它工作得很好,但是当我将它发布到生产时,我在frmA上的try..catch上得到了这个奇怪的捕获。 / p>

任何猜测?

PS:我正在使用VS2005(是的,我知道......)

3 个答案:

答案 0 :(得分:2)

Hans Passant explains this behavior非常好地回应了本网站上的另一个问题。

简而言之,当模式对话框启动时,WinForms会创建一个消息泵,因此框架会捕获所有冒泡到消息泵的异常。当在调试器下运行时,框架允许异常从模式对话框传递到调用代码,可能是因为开发人员注意到异常未被捕获。

如果不希望设置一个全局未处理的异常处理程序(并且在我已经处理过的应用程序中它是不可取的),你可以改为捕获Load事件处理程序中抛出的异常,并将捕获的异常分配给一个您表格上的新公共财产。然后,该对话框的客户端需要检查ShowDialog()返回后是否设置了该异常属性。这不是一个很好的解决方案 - 很难捕获表单中出现的所有异常,并且它还使客户端在关闭对话框时忘记检查该属性很容易 - 但它可以在某些情况下工作。

答案 1 :(得分:1)

试试这个(为我解决了类似的问题):

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Application.ThreadException += (o, e) => MessageBox.Show(e);
AppDomain.CurrentDomain.UnhandledException += (o, e) => MessageBox.Show(e);

答案 2 :(得分:0)

在开发机器上的VS外部运行它。异常是否被抓住了?
如果是的话;您可能在生产中运行了错误的DLL - 部署时会发生一些事情 然后
手动将正确的DLL复制到生产环境,然后重试。

HTH