防止WebBrowser控件吞噬异常

时间:2008-08-20 14:10:40

标签: .net winforms exception-handling webbrowser-control

我正在使用System.Windows.Forms.WebBrowser来创建一个Visual Studio Start Page视图。然而,似乎控制正在通过静默沉没来捕捉和处理所有异常!没必要告诉这是一个非常不幸的行为。

void webBrowserNavigating(object sender, WebBrowserNavigatingEventArgs e)
{
    // WebBrowser.Navigating event handler
    throw new Exception("OMG!");
}

上面的代码将取消导航并吞下例外。

void webBrowserNavigating(object sender, WebBrowserNavigatingEventArgs e)
{
    // WebBrowser.Navigating event handler
    try
    {
        e.Cancel = true;
        if (actions.ContainsKey(e.Url.ToString()))
        {
            actions[e.Url.ToString()].Invoke(e.Url, webBrowser.Document);
        }
    }
    catch (Exception exception)
    {
        MessageBox.Show(exception.ToString());
    }
}

所以,我所做的(上图)是捕获所有异常并弹出一个框,这比默默地失败但仍然远非理想的要好。我希望它通过正常的应用程序故障路径重定向异常,以便它最终变为未处理,或由来自根的应用程序处理。

有没有办法告诉WebBrowser控件停止下沉异常并以自然和预期的方式转发它们?或者有一些hacky方式通过本地边界抛出异常?

3 个答案:

答案 0 :(得分:1)

我没有看到浏览器吃异常,除非你的意思是脚本错误。可以通过browser.ScriptErrorsSuppressed属性启用脚本错误。

如果您正在讨论真正的异常,而不仅仅是脚本错误,您能否向我们展示一些可以重现问题的代码?我们广泛使用了浏览器,但没有看到你所描述的内容。

编辑当我要求代码示例时,代码示例不存在

答案 1 :(得分:0)

我最好的选择是为什么它会发生,因为有一个本地管理的原生边界可以跨越。本机部分不会正确转发托管异常,并且没有太多可以做的事情。

我仍然希望有更好的答案。

答案 2 :(得分:0)

晚了11年,但是以下解决方案对我有用。

webBrowserNavigating中,将MessageBox.Show(exception.ToString());替换为Dispatcher.BeginInvoke(() => { throw exception; });

webBrowserNavigating方法完成并且控制权返回到Windows事件循环后,异常将由常规机制引发并处理。