2016-02-28 136 views
0
try { 
    requestAnimationFrame(function re(){ 
     re(); 
    })} 
    catch (e){ 
     console.log(e); 
    } 

我在控制台上面的代码尝试过,它不能按预期工作。在我看来,虽然如何捕捉“超出最大调用堆栈大小”错误?

requestAnimationFrame(function re(){ 
     re(); 
    })} 

最终会触发一个错误,是什么引发的try是insteadly动画的ID。我如何捕获“超出最大调用堆栈大小”错误?

+0

这些错误通常来自无限循环吧? – Binvention

+0

你想通过使用'requestAnimationFrame'实现什么? – guest271314

+1

另外关于捕获最大堆栈大小超过错误的事情是我不知道它将如何工作。浏览器可以做的唯一事情就是让这个错误被捕获,这个堆栈就是空的,然后让下一个函数运行成为catch函数,但是在那个时候(我认为浏览器甚至不会那么远),你会没有迹象表明你的代码破坏了,所以你试图运行的任何东西最多都会是严重的错误。 – Binvention

回答

1

关于捕获最大堆栈大小超过错误的事情是我不知道它是如何工作的。浏览器可以做的唯一事情就是让这个错误被捕获,这个堆栈就是空的,然后让下一个函数运行成为catch函数,但是在那个时候(我认为浏览器甚至不会那么远),你会没有迹象表明你的代码破坏了,所以你试图运行的任何东西最多都会是严重的错误。

另一个问题(这可能是为什么没有浏览器有这个)是因为你会在错误后运行的大多数功能只是试图以某种方式重新启动正常的Web功能。既然你不知道发生了什么,你不能阻止它再次发生,所以你最终会一次又一次地崩溃。这会让用户和浏览器在您的网页上生气。

所以我想是可以做的最好的是确保你的代码没有无限的循环,并且能够顺利

运行堆栈大小的一个很好的说明及其工作原理可以在答案中找到到this question

+0

**这是不正确的。**您正在描述处理内存不足错误,这是不同的。 [**完全可以捕获这些异常,它们的行为与典型的异常行为不同,**请参阅我的答案](https://stackoverflow.com/a/44733190/7952582)。 –

2

您在requestAnimationFrame()函数中的函数re()中调用了相同的函数。正确的方法如下:

function re(){ 
    //code here 
    requestAnimationFrame(re); //loop back to start 
} 
+1

谢谢。虽然这不是我的问题的答案,但它是我要问的问题的答案。 – shenkwen

+1

我也想指出,这不是一个无限循环,他的代码是一个无限循环。以这种方式使用requestAnimationFrame将导致该函数运行,直到导致它停止为止,但它在技术上不是无限循环,因为requestAnimationFrame只在浏览器准备重新绘制Dom之前调用,因此您不会像运行一样的函数在他的问题中,您正在定期运行一个函数 – Binvention

+0

为了澄清,我只回答了问题的第二部分,我个人不知道如何成功捕获最大调用堆栈大小错误。这里有一些关于[JavaScript Stack Sizes]的信息(http://bahmutov.calepin.co/javascript-stack-size.html),并提供了计算它们大小的一些信息。 – TheMintyMate

2

最大调用堆栈尺寸超出误差可以被捕获,就像任何其他错误

try { 
 
    function recur() { recur(); }; 
 
    recur(); 
 
} catch (ex) { 
 
    console.log("caught " + ex); 
 
}

在这种情况下(超出调用堆栈大小)做什么没有在ECMAScript规范中定义,但实际上,所有浏览器都会抛出可捕获的异常。然而,缺乏规格不同的浏览器已经选择抛出不同类型的例外:我有Error,RangeErrorInternalError

代码中的问题与此无关。问题在于,您正在尝试捕获拨打requestAnimationFrame()时发生的异常。但您的re()函数不会在该点运行,它会在您请求的下一帧期间运行。里面的re(),你可以用递归调用re()和捕捉堆栈溢出异常,而不是有:

requestAnimationFrame(function re(){ 
 
    try { 
 
    re(); 
 
    } catch (ex) { 
 
    console.log("caught " + ex); 
 
    } 
 
});

相关问题