如何处理此异常? (在promise内的回调中)

这个问题涉及一些nodejs代码。我试图清除关于异常处理方式以及promise / async函数如何相似/不相似的想法。

我大大简化了代码,在下面提供了一个(非功能性的)示例。我有一个函数(uploadFile)返回一个承诺。该函数调用另一个引发异常的异步函数。

const Linebyline = require('line-by-line');

const uploadFile = (filename) => new Promise((resolve,reject) => {
    console.log(`Upload ${filename}`);
    const lr = new Linebyline(filename);

    lr.on('line',async (line) => {
        // Another async function throws an error here,// replacing it with a simple "throw" to clarify things:
        throw(new Error("failed"));
    }
}

async function top() {
    try {
        await uploadFile('test.txt');
    } catch (err) {
        console.log(`Err: ${err}`);
    }
}

使用此方案,我得到了未处理的拒绝。由于我在上层函数中有一个try / catch调用uploadFile,因此我希望该catch可以处理子调用中几乎所有的工作。

如果我在uploadFile中捕获了“ throw”并将其转换为拒绝,那么一切都很好。

很明显,不是打电话给我,我是在找麻烦,但是我真的不理解那个“掷”产生的事件链吗?

谢谢。

flh12004029 回答:如何处理此异常? (在promise内的回调中)

您使用Promise构造函数错误。错误时应呼叫reject或成功时应呼叫resolve。你什么都不做。如果您只是在承诺中致电reject,那么await会抛出错误,这就是您要在此处进行的操作。

,

因此,就您当前的Promise回调而言,uploadFile内部的抛出是错误的。

您应该拒绝不引发错误。 但是,如果仍然要抛出错误,则将其包含在try and catch块中。


const Linebyline = require('line-by-line');

const uploadFile = (filename) => new Promise((resolve,reject) => {
    console.log(`Upload ${filename}`);
    const lr = new Linebyline(filename);

    lr.on('line',async (line) => {

       try{
        // enclose this throw inside try & catch block  
         throw new Error("failed");
       }catch(error){
        // handle error which is not handled in here
          reject(error)
       }
    }

    // Other code continues,calling resolve and reject...
}

async function top() {
    try {
        await uploadFile('test.txt');
    } catch (err) {
        console.log(`Err: ${err}`);
    }
}

对于您的最新问题,答案如下:

  

堆栈

  • 在程序运行时,信息存储在数据结构中 称为堆栈。调用方法时,信息存储在 直到方法返回的堆栈。由于方法通常包含 调用其他方法时,堆栈会增长和缩小,直到所有 方法已返回(这通常是程序的结尾)。 引发错误时,它将向下传递给函数调用堆栈 直到被抓住和处理或到达之前尚未返回 “ main”方法,通常会导致程序崩溃。
  

事件循环

  • 事件循环是驱动异步功能的关键 Javascript。当setTimeout或任何其他异步方法是 称为回调的事件被放置在称为事件循环的队列中。如 javascript运行时将执行程序并到达末尾 堆栈(例如,所有方法均已返回),而不仅仅是退出 该程序首先查看以查看是否有任何事件 循环,如果有它开始执行,则会导致堆栈增长 再缩小一次如果事件循环中没有任何内容, 并且堆栈为空,则程序可以自由退出。

这意味着,当您调用 lr.on('line',async(line)=> {时,传递给该方法的回调最终将在不同的堆栈框架中执行。意味着不可能将错误扔到堆栈中并被promise捕获,因为在promise中创建的堆栈已经完成执行并且不再存在。

因此,您可以使用promise的resolve / reject上下文连接两个堆栈帧,以将调用推送到堆栈中,因此在执行异步功能后,resolve / reject将保留在堆栈中。

本文链接:https://www.f2er.com/2837962.html

大家都在问