我可以在Javascript中抛出一个异常来阻止Javascript执行吗?

时间:2012-02-24 13:18:08

标签: javascript

我尝试模拟一个问题,即从外部网址加载的脚本会停止在我的网站上执行更多脚本。

我尝试通过调用不退出的函数来模拟这样的问题。我可以在firebug中看到错误,但页面上的不同脚本仍在执行。

Javascripts中有不同类型的错误吗?如果是:什么样的错误会阻止脚本执行?我只需要Firefox的答案。

修改

这个问题很容易被误解,但是Rob W得到了它:我需要抛出异常并且该异常需要停止进一步的脚本执行。

4 个答案:

答案 0 :(得分:19)

  

回答标题:
  回答“JavaScript中存在不同类型的错误**:是的,请参阅MDN:Error
  语法错误将阻止整个脚本块被执行,   其他错误(TypeErrors,Reference errors)只会在发生错误后停止执行。

不同的<script>块分别执行。您无法通过在第一个块中抛出错误来阻止执行第二个块(演示:http://jsfiddle.net/WJCEN/)。

<script>Example: Syntax error in this script.</script>
<script>console.log('Still executed.')</script>

此外,如果使用try-catch(演示:http://jsfiddle.net/WJCEN/1/)捕获错误,则错误甚至不会停止执行整个块。

try {throw 'Code';}catch(e){}
console.log('Still executed');

<小时/> 没有通用的one-fit-all方法来阻止所有代码运行。对于单个脚本,您可以使用一些技巧来阻止代码进一步运行。

示例1(demo):临时覆盖方法

1: <script>window._alert = alert;alert=null;</script>
2: <script>alert('Some code!');confirm('Not executing');</script>
3: <script>alert=_alert;delete window._alert;alert('Done!');</script>

此方法基于脚本2期望alert成为函数的事实。我们已将alert重写为非函数属性(脚本1)。脚本2抛出TypeError,跳过第二个块 我们在脚本3中恢复原始值。

示例2(demo):定义一个不能被覆盖的常量方法。

4. <script>Object.defineProperty(window, 'test',{value:null});</script>
5. <script>var test=function(){alert('Test');};test();alert('What?');</script>

此方法依赖于Object.defineProperty方法,以有效地定义常量值。在严格模式下,var test声明会抛出TypeError:“test is read-only” 如果未启用严格模式,则会在test()处抛出TypeError:“test is not a function”(因为我们在脚本4中将test定义为常量)。

注意:最后一个方法无法正常使用函数声明(请参阅bug #115452,Chrome 17)

答案 1 :(得分:1)

您可以使用支持以下两个属性的错误对象:

name: The name of the error.
message: A description of the error.

例如,要停止执行,您可以使用:throw new Error("myError");

  

Javascripts中有不同类型的错误吗?

除了通用的Error构造函数之外,JavaScript中还有其他六个核心错误:

请参阅here有关这些错误的详细信息。

答案 2 :(得分:1)

停止执行

throw new Error('stopIt');

这也可以解决问题:

throw 'Stop It!';

答案 3 :(得分:0)

使用 try catch finally block

它会起作用