如何将多个异常记录到控制台?

Luc*_*les 1 javascript exception

我在 Javascript 中犯了两个引用错误,try-catch 只捕获了一个错误。如何捕获代码块内的所有异常(错误)try

    try {
      let x = y + 5; // ReferenceError: y is not defined
      nonexistfunc(); //ReferenceError: nonexistfunc is not defined
    } 

    catch(error){
        let errorArr= [];
        errorArr.push(error);
        console.log(errorArr);    // Output: ReferenceError: y is not defined
    }
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 5

您的代码不会导致两个错误,因为一旦发生第一个错误(y未定义),try块的执行就会终止,控制权将传递给catch块。该nonexistfunc()声明从未被尝试过。由于没有尝试引用nonexistfunc,因此这样做不会出错。没有要记录的两个错误,只有一个。

如果您想引发并捕获两个错误,则需要两个块:

let errorArr = [];

try {
    let x = y + 5; // ReferenceError: y is not defined
} catch (error) {
    errorArr.push(error);
}

try {
    nonexistfunc(); // ReferenceError: nonexistfunc is not defined
} catch (error) {
    errorArr.push(error);
}

if (errorArr.length) {
    console.log(errorArr);
}
Run Code Online (Sandbox Code Playgroud)

也就是说,将所有内容包装在try/catch块中通常不是您想要做的。但在这种特定情况下,如果您确实想获得这两个错误,则必须这样做,以便第一个错误不会阻止导致第二个错误的代码运行。


我听说有人考虑为 JavaScript 提出一项功能,该功能的名称听起来很奇怪,即代数效应,其中一个方面是catch块中的代码(或块的某些新版本)将能够继续代码该try块,大概是在对错误采取某种纠正措施之后。(Visual Basic [包括 VB.Net] 在其几乎已弃用的声明中包含了这一点On Error Goto ___Resume)但我不认为这种讨论已成为实际的提案(至少,我没有在列表中看到它) )。