2016-02-28 141 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); 
 
    } 
 
});

相關問題