我正在使用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方式通过本地边界抛出异常?
答案 0 :(得分:1)
我没有看到浏览器吃异常,除非你的意思是脚本错误。可以通过browser.ScriptErrorsSuppressed
属性启用脚本错误。
如果您正在讨论真正的异常,而不仅仅是脚本错误,您能否向我们展示一些可以重现问题的代码?我们广泛使用了浏览器,但没有看到你所描述的内容。
编辑当我要求代码示例时,代码示例不存在
答案 1 :(得分:0)
我最好的选择是为什么它会发生,因为有一个本地管理的原生边界可以跨越。本机部分不会正确转发托管异常,并且没有太多可以做的事情。
我仍然希望有更好的答案。
答案 2 :(得分:0)
晚了11年,但是以下解决方案对我有用。
在webBrowserNavigating
中,将MessageBox.Show(exception.ToString());
替换为Dispatcher.BeginInvoke(() => { throw exception; });
。
webBrowserNavigating
方法完成并且控制权返回到Windows事件循环后,异常将由常规机制引发并处理。