簡體   English   中英

如果庫吞沒所有異常,我如何調試我的異步,基於承諾的代碼?

[英]How do I debug my asynchronous, promise based code if the library is swallowing all the exceptions?

問題

JSFiddlehttp//jsfiddle.net/missingno/Gz8Pe/2/

我有一些看起來像這樣的代碼:

var d = new Deferred();
d.resolve(17);
return d.then(function(){
     //do some stuff...
})
.then(function(){
    var obj = a_funtion_that_returns_null_on_IE();
    var x = obj.some_property; //BOOM!
});

問題是,當我在IE上時,我只能看到'obj' is null or not an object錯誤, 沒有任何對相應行號的引用,也沒有調試器在違規行停止 (就像我希望的那樣)。

這種問題使得代碼很難調試,我現在能想到的唯一解決方案(搞亂控制流程圖或使用調試器或console.log進行逐步調試)是我的事情。寧可不必做。

我的想法是怎么回事

為了允許在鏈被觸發后添加errbacks, then將搶先捕獲回調拋出的任何異常。 我認為這是IE調試器沒有停止錯誤或顯示通常的錯誤消息的原因,其中包含行號。

沒有行號的錯誤消息來自控制流庫:它提供了一個deferredOnError鈎子,只要捕獲並保存以供日后使用,就會調用它,默認行為是console.error -ing Error對象:

dojo.config.deferredOnError = function(err){
    //a chance to log the exception after it is captured by "then"
    //or do other things with it
    console.error(err);
}

遺憾的是,我無法找到從IE中的錯誤對象獲取行號或堆棧跟蹤的方法,並且以一種不允許我重新拋出異常並讓它冒泡到頂層的方式調用鈎子。

我想要的是

我希望有一種更好的方法來調試異步代碼,然后逐步調試調試器。 在最好的情況下,有一種方法可以讓調試器暫停異常 (就像在未處理的異常上一樣), 或者至少是拋出的Error對象獲取行號或堆棧跟蹤的方法

這適用於沒有事先配置的任何框架,所有最近的瀏覽器都支持此功能

暫停捕獲的異常:這實際上會阻止javascript的執行,並且會在問題代碼發生的時候將其帶到您的確切位置。

暫停捕獲的異常

在Chrome中:

  1. 開發者工具
  2. 來源標簽,
  3. 暫停異常 (類似停止的圖標)然后
  4. 暫停捕獲例外復選框

我最終做了什么

我在我的迷你輔助函數庫中添加了一個排序函數。 它基本上運行一系列“then”調用,除了它添加了額外的中間步驟來重新拋出最終被Deferreds捕獲的異常。 它還接受一個可選的錯誤處理程序來捕獲異常。

當我打電話給它時,它看起來像這樣:

go([
    function(){
        return 17;
    },
    function(x){
        //return some stuff
    },
    function(){
         var obj = a_function_that_returns_null_on_IE();
         var x = obj.some_property; //BOOM!
    }
], function(){
    //an optional error handler
});

我這樣做的另一個原因是我有很多代碼需要同步和異步代碼(使用Deferred.when進行鏈接)。 使用我的自定義函數讓我使用單一,統一的語法,並且在異步情況下未捕獲的錯誤與同步情況一致,其中不涉及延遲。 我也認為沒有捕獲錯誤是可以的,因為與一般情況不同,當我使用“go”時,我知道將會調用哪些代碼,因此如果有人需要捕獲,則無需捕獲異常他們將來。

此外,使用自定義解決方案讓我可以自由地執行一些個人設計偏好:)


除此之外,我最終減少了我在整個代碼庫中生成的異常數量。 在異步代碼中管理異常比平常更煩人,有時通過返回null或錯誤代碼來回退到處理錯誤條件更簡單。

此外,我們確保我們自己創建的任何異常都是內置Error類的實例,其他對象的內容。 原因是內置的Error類以一種跨瀏覽器的方式記錄它的生成位置的行號和堆棧跟蹤。

2016解決方案

如果你正在使用原生的ES Promises,那就什么都不做; Chrome會自動在控制台中報告未被捕獲的拒絕承諾。

Chrome開發工具中的“Uncaught Promise錯誤”

注意捕獲的一個( Second fail )沒有顯示任何內容,但代碼完成運行后控制台中出現未被捕獲的拒絕。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM