2010-09-07 24 views
1

这次我没有任何问题,只是为了好奇,我想知道JavaScript中有多少例外。JavaScript例外列表

比如我使用下面的代码:

<script type="text/javascript"> 
    var x; 
    try{ 
     x = 1/0; 
     alert(x); // output: Infinity. FYI: JavaScript has Infinity property and it's value is 1.7976931348623157E+10308 
     alert(funCreate()); 
    } 
    catch(obj) 
    { 
     alert(obj.fileName); 
     alert(obj.lineNumber); 
     alert(obj.message); // output: funCreate is not defined 
     alert(obj.name); // output: ReferenceError 
     alert(obj.stack); 
    }; 
</script> 

这里的ReferenceError就像是一个异常的类型。所以如果它被视为一个异常类型,那么我们可以通过类型来处理异常吗?就像我们大家都用其他编程语言一样。见link

谢谢...

+2

Infinity是无限的,它是*不是* 1.7976931348623157E + 308 – kennytm 2010-09-07 08:10:15

+1

@KennyTM - 试试这个:'alert(1.7976931348623157e + 309)'。这应该不会令人惊讶。你如何在双精度浮点数中表示实际的无穷大?那么,你不能。当你用尽点数来表示数字时,你会发现什么?就JS而言,任何超出1.7976931348623157e + 308的值都是'Infinity'。 JS不应该是数值精度的首选。 – Andrew 2010-09-07 09:33:24

+0

是,当数字超过浮点数的上限时显示无穷大,即1.7976931348623157E + 10308。 – Vikas 2010-09-07 09:51:47

回答

2

有在JavaScript中没有这样的语法,但你可以很容易地实现类似的事情:

var x; 
try{ 
    x = 1/0; 
    alert(x); // output: Infinity. FYI: JavaScript has Infinity property and it's value is 1.7976931348623157E+10308 
    alert(funCreate()); 
} 
catch(obj) 
{ 
    switch(obj.name) { 
     case 'ReferenceError': 
      alert(obj.fileName); 
      alert(obj.lineNumber); 
      alert(obj.message); // output: funCreate is not defined 
      alert(obj.name); // output: ReferenceError 
      alert(obj.stack); 
     break; 
     case 'AnotherError': 
      //do other things 
     break; 

     default: 
      //other stuff 
    } 
}; 
2

你可以扔在JavaScript的东西,所以没有可能的例外列表。如果你想查看默认异常对象的所有属性,我会推荐萤火虫的console.log() -command。

10

相信有六种异常类型在JS:

  1. EvalError(从eval()产生的误差;
  2. RangeError(使用一个数字,是不在上述范围内的对正在使用它时产生 - 我其实从未在现实生活中看过这个,现在看起来似乎无法生成它);
  3. ReferenceError(试图通过名称访问不存在的对象成员时产生);
  4. SyntaxError;
  5. TypeError(当一个方法期待不同类型的值时);和
  6. URIError(尝试创建或解码URI时产生)。

不幸的是,这些异常类型并未得到普遍支持 - 两大支持方案是Safari和Opera。同样,你会发现lineNumberfileName只能在Firefox(也许是其他的?)上工作,而你为message返回的字符串因浏览器而异。因此,在实践中,最好避免使用它们,并手动更直接地管理异常处理。

+0

是的,lineNumber和fileName仅适用于Firefox!但是相同的代码给出了IE中obj.name的不同值!在IE中,它给了TypeError! – Vikas 2010-09-07 09:14:01

+0

我经常想到,错误处理消息中存在如此多元化的原因在于,很少开发人员实际上在JS中进行错误处理。除了大的JS框架之外,我不记得上次我看到'throw'被用在某人的代码中。将其与C#或Java比较,其中超过一半的代码最终只能处理异常。总而言之,我更喜欢JS,因为实际上。 – Andrew 2010-09-07 10:12:20

+0

我试图通过编写'if(1 == 1)throw(“My error”)抛出自定义异常;'但是owr catch处理程序接受对象类型。所以我通过用Literal Notation创建它来传递一个对象,'if(1 == 1)throw {name:“custom”,message:“My error”};' – Vikas 2010-09-07 10:44:09