我们如何在 JavaScript 中抛出和捕获 RangeError、ReferenceError、TypeError?

Posted

技术标签:

【中文标题】我们如何在 JavaScript 中抛出和捕获 RangeError、ReferenceError、TypeError?【英文标题】:How do we throw and catch a RangeError, ReferenceError, TypeError in JavaScript? 【发布时间】:2011-03-19 23:47:15 【问题描述】:

我想知道你们中是否有人尝试过使用 javascript 的异常处理机制来捕获 RangeError、ReferenceError 和 TypeError 等错误?

以 RangeError 为例:

try 
var anArray = new Array(-1); 
// an array length must be positive

         throw new RangeError("must be positive!")

catch (error)   
         alert(error.message);
         alert(error.name);

finally 
         alert("ok, all is done!");

在上述情况下,我是否抛出了一个新的 RangeError 对象?

因为我在 alert(error.message) 的代码示例没有显示用户定义的“必须是肯定的”消息。

我可以做些什么来抛出我自己的 RangeError 对象(和 ReferenceError、TypeError)?

最好的。

【问题讨论】:

【参考方案1】:

这已经快一年了,但我认为迟到总比没有好。这取决于浏览器,但在某些情况下(coughcoughFIREfoxcough),RangeError 会继承Error 对象的 message 属性,而不是提供它自己的属性。恐怕唯一的解决方法是抛出new Error("must be positive!")。对不起。

【讨论】:

【参考方案2】:

实际上,JavaScript 中的数组索引不需要为正数,因为这里的数组本质上是哈希表。如果您尝试访问数组中不存在的键,则结果将只是 undefined

你可以用一个简单的条件来捕捉它:

if (typeof someArray[foo] !== "undefined") 
    //do stuff
 else 
    //do error handling
    //Here I'm just throwing a simple exception with nothing than a message in it.
    throw new Error('something bad happened');

不过,我不确定您所说的“TypeError”是什么意思。请提供更多细节。

【讨论】:

developer.mozilla.org/en/Core_JavaScript_1.5_Reference/… 偶然发现了这一点,我必须纠正你:new Array(-1) 无效。虽然您对索引不必为正数是正确的,但Array 构造函数的第一个参数是创建后数组中的元素数(全部默认为undefined)并且默认为零。显然,您不能创建一个包含少于 0 个元素的数组。 (也不是说在 Javascript 数组中使用负索引不会调整 length 属性,因为它表示已使用的最高正索引。这就是为什么在大多数情况下不允许它们是有意义的)

以上是关于我们如何在 JavaScript 中抛出和捕获 RangeError、ReferenceError、TypeError?的主要内容,如果未能解决你的问题,请参考以下文章

异常的抛出和捕获

是否有可能捕获JavaScript异步回调中抛出的异常?

如何捕获ctypes中抛出的异常?

如何捕获 node_modules 中抛出的异常

当它被抛出和捕获时,不要在那个异常处停止调试器

Objective-C 在静态库中抛出异常。如何使用该库从程序中捕获异常?