gpt4 book ai didi

c# - 为什么 Method.Invoke 会生成未处理的异常?即使使用 TargetInvocationException 也无法捕获

转载 作者:行者123 更新时间:2023-11-30 22:35:36 24 4
gpt4 key购买 nike

我正在尝试使用 Method.Invoke 调用 Windows 窗体对话框,让用户执行一些选择/交互并继续执行。此调用在异步方法中发生。

虽然一切正常,但如果 Windows 窗体发生错误,则会抛出未处理的异常,即使在 try catch TargetInvocationException 或只是 Exception 时也是如此。

两种形式都在同一个winforms项目中。我知道还有其他方法可以执行异步调用,但这只是为了说明问题。

窗体对话框如下:

public partial class FakeDialog : Form
{
public FakeDialog()
{
InitializeComponent();
}

private void btnOK_Click(object sender, EventArgs e)
{
throw new Exception("oh noes!");

this.DialogResult = DialogResult.OK;
this.Close();
}

private void btnCancel_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Cancel;
this.Close();
}

public new DialogResult ShowDialog()
{
base.ShowDialog();
return this.DialogResult;
}
}

这是调用代码。如果正在执行 catch block ,则没有,即使没有调试(我的问题不是在 IDE 中调试异常,如前所述 here。以下结果导致未处理的异常)。

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{

MethodInvoker simpleDelegate = new MethodInvoker(InvokeForm);
IAsyncResult tag = simpleDelegate.BeginInvoke(null, null);
simpleDelegate.EndInvoke(tag);
MessageBox.Show("All done");
}

private void InvokeForm()
{
try
{
Type t = typeof(FakeDialog);
MethodInfo showDialogMethod = t.GetMethod("ShowDialog", new Type[] { });
object dialog = Activator.CreateInstance(t);
System.Windows.Forms.DialogResult result = (System.Windows.Forms.DialogResult)showDialogMethod.Invoke(dialog, new object[] { });
MessageBox.Show(result.ToString());

}
catch (TargetInvocationException tie)
{
MessageBox.Show("Tie exception");
}
catch (Exception ex)
{
MessageBox.Show("general exception");
}
}
}

更新:

奇怪的是,我能够在调试运行时捕获异常(我确信 IDE 在这里提供帮助)。在没有调试的情况下运行会导致未处理的异常。

此外,通过异步调用进行调用似乎没有什么不同。如果我只调用 InvokeForm()(忽略所有 methodInvoker 的东西),我可以获得相同的结果。

使用 Visual Studio 2008 在 .NET 2.0 上运行。

最佳答案

好的,明白了。

代码的结果是未处理的异常。虽然将 Method.Invoke 用于另一个类中的简单方法会正常运行,但环境会随着表单中发生的异常源而变化。一个表单事件。我最终在 Microsoft 支持上找到了 unhandled exceptions in Windows Form events are not propagated up call stack.这有一些非常有趣的原因(“Windows 窗体应用程序有一个顶级异常处理程序,允许程序在可以恢复时继续运行”)。

这也证实了 Marc 提到的将东西放在 Load 事件中的说法。叹。所以这一切的原因现在很明显了。

至于代码在调试时运行良好(与没有调试时相比),我想我可以为此感谢 JIT 调试器。 @fluf 向我指出,专门启用 JIT 调试器会产生与运行调试相同的结果。 @Marc Gravell,根据 VS 设置,这可能解释了只有 I 和 fluf 可以重现。关于它还有更多信息 here但这不是生产修复。

所以真正的解决方案是在事件处理程序本身中处理异常,或者使用上面 Microsoft 支持文章中提到的解决方案,它解决了我的问题。

关于c# - 为什么 Method.Invoke 会生成未处理的异常?即使使用 TargetInvocationException 也无法捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7397871/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com