Javascript 异步方法何时抛出,如何捕获它们?

Javascript 异步方法何时抛出,如何捕获它们?,javascript,node.js,exception,asynchronous,Javascript,Node.js,Exception,Asynchronous,从节点: Node.js API中的一些典型异步方法可能 仍然使用抛出机制来引发必须处理的异常 使用try/catch。没有此类方法的综合清单; 请参阅每种方法的文档,以确定 需要适当的错误处理机制 有人能举一个这样的函数的例子,它是异步的并且仍然抛出?那么,您如何以及何时捕获异常 尤其是。它们是否指此类功能: try { obj.someAsync("param", function(data){ console.log(data);

从节点:

Node.js API中的一些典型异步方法可能 仍然使用抛出机制来引发必须处理的异常 使用try/catch。没有此类方法的综合清单; 请参阅每种方法的文档,以确定 需要适当的错误处理机制

有人能举一个这样的函数的例子,它是异步的并且仍然抛出?那么,您如何以及何时捕获异常

尤其是。它们是否指此类功能:

try
{

   obj.someAsync("param", function(data){
                    console.log(data);
                 });
}catch(e)
{

}
现在通常我知道上面的内容是没有意义的,因为当回调执行时,
try
block可能已经退出了

  • 但是,从文档中摘录的内容指的是什么样的示例呢?如果异步方法按照他们说的那样抛出,我应该在哪里、何时以及如何处理它?(或者,如果你展示了这样的功能,你能展示一下它在文档中的什么地方,上面写着如何处理报价单上提到的功能吗?)

afaik异步函数有三种方式可以“抛出”;以及如何捕捉其中的每一个:

  • 与任何其他函数一样(也就是说,有人搞错了):我不会捕获这些情况,因为它们不应该出现在我的代码中,而捕获这些错误会使查找和修复它们变得更加困难
函数foo(){
//有人搞砸了,修理总比抓住这个好
返回新的prooomise((解析)=>42);
}
试一试{
foo();
}捕捉(错误){
控制台错误(err);

}
异步方法(如示例中的异步方法)通常会抛出程序员错误(如错误参数),并调用带有错误的回调函数(如操作错误)

但ES2017中也有异步函数(用
async function
声明)和那些通过拒绝返回的承诺来发出错误信号的函数,当您将它们与
wait
关键字一起使用时,它们会变成抛出的异常

示例:

function x(arg, cb) {
    if (!arg) throw new Error('Programmer error: bad arguments');
    setTimeout(() => {
        cb(new Error('Operational error: something bad happened'));
    }, 2000);
}
现在,当您使用它时,您通常不想处理程序员错误,而是想修复它们。所以你不会这么做:

try {
    x();
} catch (err) {
    // Why should I handle the case of bad invocation
    // instead of fixing it?
}
您可以这样处理操作错误:

x(function (err) {
    if (err) {
        // handle error
    } else {
        // success
    }
});
y().catch(error => {
    // handle error
});
现在,如果您有一个不接受回调但返回承诺的函数:

function y() {
    return new Promise((res, rej) => setTimeout(() => rej('error'), 2000));
}
然后按如下方式处理错误:

x(function (err) {
    if (err) {
        // handle error
    } else {
        // success
    }
});
y().catch(error => {
    // handle error
});
或者,在使用
等待时:

try {
    await y();
} catch (err) {
    // handle error
}
有关操作错误和程序员错误之间差异的更多信息,请参阅:

  • 戴夫·帕切科

有关promises和async的更多信息,请参见中的链接。

你能举一个这样的函数的例子吗,我可以试试。@AbhinavGauniyal如果你仔细看看这个问题,我正在寻找这个函数(或假设的函数)以及你自己处理它的方法哦,不知道我是怎么跳过的。通常我看到错误作为
err
参数从父异步函数传递到回调函数,所以我也很好奇。@AbhinavGauniyal是的,你可以很好地检查文档,
err
案例是单独处理的,而这一个是单独处理的。@GiorgiMoniava如果有帮助的话-公平地说,两者都不是第二个。那个catch调用是为了承诺,文档清楚地说明了-
必须使用try/catch
@AbhinavGauniyal来处理的异常,那又怎样?您是否说您无法捕获异步错误,因为处理异步错误的工具不包含try..catch块?@Thomas请阅读有关异常的信息,然后提出此类问题。如果您调用
dns.lookup({})
,就是一个例子。我正在试图理解文档的这一部分-
,它必须使用try/catch处理,如果您忽略了这一点,并且仍然使用通常的
if(err){}
语法来处理它,那么文档说明它是错误的,或者您没有正确地处理它们。请注意,文档中确实有另一部分
if(err){}
处理错误的方法,这意味着这些错误与
try/catch
不同,这增加了混淆。@rsp:我是否正确理解了是否需要使用示例中的第一个函数
x
,我都需要将它封装在try/catch中,并在callback中检查err?@GiorgiMoniava实际上这要看情况而定。要使用我的第一个函数
x()
,只有在需要处理程序员错误调用带有错误参数的
x()
函数时,才需要同时使用这两个函数,但是,如果您希望此错误停止您的程序,以便您可以注意到它并进行修复,那么您不希望在那里尝试/捕获,您应该只在回调中检查
err
,因为这是一个操作错误,即使程序是正确的(例如与数据库的连接断开或类似情况),也可能发生而且也没有什么可修复的。请参阅我答案中有关处理错误的文章,了解基本原理