在IE中的不同Window上执行try / catch

时间:2011-10-17 14:38:52

标签: javascript cross-browser

考虑包含iframe的网页。 iframe的内容可能如下所示

<script type="text/javascript">
    window.foo = function () {
        nonExisting();
    };
    window.bar = function () {
        throw "An error!";
    };
</script>

现在,我想执行这样的事情:

try {
    iframe.contentWindow.foo();
} catch (e) { console.log('ok'); }

try {
    iframe.contentWindow.bar();
} catch (e) { console.log('ok'); }

这就是我得到的:

  • Chrome / Firefox / Opera - 'ok','ok'
    (预期的行为)
  • IE8 - “预期的对象”错误,未捕获异常

WTF正在这里?当我使用try / catch块时,这怎么可能是一个未被捕获的异常?那是一个错误吗?或者规范中的任何内容都允许这种行为吗? 最重要的是:我可以让它按预期工作吗?

2 个答案:

答案 0 :(得分:2)

那是因为你有一个拼写错误:"An error"!

如果我在IE9模拟的情况下在没有错误的情况下运行它,它可以工作:http://jsfiddle.net/vsSgE/3/

答案 1 :(得分:1)

我今天遇到了这个问题。我在父窗口中定义了几个“异常类”,我将其“导入”子窗口(iframe),以便能够在父窗口中使用instanceof处理它们。像这样:

父窗口

window.MyExceptions = {
    RenderingException: function () { ... }
    // ...more exception types
};

// Somewhere further down in the code, assuming 'iframe' is the child iframe
try {
    iframe.contentWindow.renderAllTheThings();
} catch (ex) {
    if (ex instanceof MyExceptions.RenderingException) {
        // ...
    }
}

儿童(iframe)窗口

window.MyExceptions = window.parent.MyExceptions; // Import exception types
window.renderAllTheThings = function () {
    // ...
    throw new MyExceptions.RenderingException();
};

使用此设置,我遇到了与您相同的问题 - 它在我测试的所有现代浏览器中都有效,但在IE8中因“未捕获的异常”错误而失败。

我的解决方法是在执行实际投掷的父窗口中的MyExceptions对象中添加一个简单的实用程序函数,如下所示:

window.MyExceptions = {
    RenderingException: function () { ... },
    // ...more exception types
    Throw: function (ex) {
        throw ex;
    }
};

然后每当我想从子窗口中抛出异常以便在父窗口中处理时,我会MyExceptions.Throw(new MyExceptions.RenderingException());

不完全优雅,但我需要让它发挥作用。