Javascript 调试DOM承诺中的异常

Javascript 调试DOM承诺中的异常,javascript,asynchronous,exception-handling,error-handling,promise,Javascript,Asynchronous,Exception Handling,Error Handling,Promise,不久前,Chrome开发工具开始支持异步堆栈跟踪(),所以现在我们可以避免调试异步代码的痛苦 但DOM承诺()也发布了,成功地将痛苦带回来 若在承诺的代码中的某个地方抛出了任何异常,那个么它将被承诺系统吞并,即使启用了“暂停异常”,也不会让调试器停止 好的,我们可以打开“捕获异常时暂停”,但这将导致每次拒绝承诺时暂停通常是多余的。我只想捕捉各种真实的JavaScript或库错误,这些错误表明我的代码编写不正确。承诺可能会在没有逻辑错误的情况下被拒绝,但: function showLargeIm

不久前,Chrome开发工具开始支持异步堆栈跟踪(),所以现在我们可以避免调试异步代码的痛苦

但DOM承诺()也发布了,成功地将痛苦带回来

若在承诺的代码中的某个地方抛出了任何异常,那个么它将被承诺系统吞并,即使启用了“暂停异常”,也不会让调试器停止

好的,我们可以打开“捕获异常时暂停”,但这将导致每次拒绝承诺时暂停通常是多余的。我只想捕捉各种真实的JavaScript或库错误,这些错误表明我的代码编写不正确。承诺可能会在没有逻辑错误的情况下被拒绝,但:

function showLargeImage (user) {
    return Promise(function (resolve, reject) {
        if (!user.image.large) {
            // Expected behavior. No exception pause needed.
            reject('No larger image.');
        } else {
            // What if element doesn't exist? We want to catch exception here.
            $('#user-' + user.id + '-large-image')[0].style.display = 'block';
            resolve();
        }
    });
}
有人面临过同样的问题吗?如何调试该代码

更新:代码示例错误。异常只在“then”处理程序(而不是promise body)中包含。应该是这样的:

function showLargeImage (user) {
    return loadLargeImage(user).then(function (largeImage) {
        if (!largeImage) {
            // Expected behavior. No exception pause needed.
            return Promise.reject('No larger image.');
        } else {
            // What if element doesn't exist? We want to catch DOM exception here.
            $('#user-' + user.id + '-large-image')[0].src = largeImage;
            return true;
        }
    });
}

简单解决方法-避免DOM承诺。他们还没有准备好生产

这是一个众所周知的问题。DOM目前的承诺是相当实验性的:

  • 它们比像Bluebird这样的快速承诺实现慢得多
  • 它们在Chrome中提供无
    .done
    方法或未经处理的拒绝检测。例外情况将被默默地吞噬
  • 它们提供的功能非常有限
如果您必须使用DOM承诺,请使用Firefox,版本27+具有基于GC的未处理拒绝检测功能。堆栈跟踪仍然比Bluebird的要糟糕得多,但至少它不会默默地接受异常

好处是,有计划在Chrome DOM承诺中构建更好的未处理拒绝检测

您可以使用Bluebird并将其替换为生产中的本地承诺(尽管它的性能优于它们,并且您确实希望在生产中具有良好的可调试性)

但是我该如何处理我当前的代码呢?
大多数promise库,如Bluebird,都可以作为替代品。

定义“写入错误”。你不是说语法错误吧?我猜:在关键部分使用try-catch,然后用错误消息拒绝?@MaxArt,我不是。我指的是上面例子中的逻辑错误。@bbuechell有什么区别?我可以评估将导致异常的代码,我可以抛出我自己的异常,或者我可以拒绝承诺。问题是一切都是一样的。这将导致拒绝承诺并捕获异常,并且调试器中没有暂停。ES6承诺在应用程序代码中不可用,请尝试具有更好错误处理和调试实用程序(如bluebird或when)的承诺库。这在2016年7月仍然相关吗?