1

所以,我有这种情况:

解决方案

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

我的主要应用程序在项目 A 中,在这个 FrmA 表单中,有一个方法可以在项目 B 中的 try..catch 中实例化并调用 FrmB 上的方法,这个 FrmB 在第二个 try..catch 块中有一个 throw可以很好地捕获异常,但不会将其扔回 frmA catch 块。像这样的东西:

频率:

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 上得到了这个奇怪的不捕捉。

有什么猜测吗?

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

4

3 回答 3

2

Hans Passant在回答本网站上的另一个问题时很好地解释了这种行为。

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

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

于 2013-08-02T21:23:08.383 回答
1

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

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Application.ThreadException += (o, e) => MessageBox.Show(e);
AppDomain.CurrentDomain.UnhandledException += (o, e) => MessageBox.Show(e);
于 2013-08-02T20:37:30.860 回答
0

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

高温高压

于 2013-08-02T20:24:15.367 回答