无法使用 try-catch 处理未处理的 Promise Rejection

Posted

技术标签:

【中文标题】无法使用 try-catch 处理未处理的 Promise Rejection【英文标题】:Cannot handle Unhandled Promise Rejection using try-catch 【发布时间】:2021-08-08 20:28:43 【问题描述】:

您好,我刚刚下载了 ytdl-core 模块,但遇到了无法处理的 Promise Rejection!有人可以帮忙吗?

app.get("/getaudio", async (req, res) => 
  const videoID = req.query.v;
  const quality = req.query.q;
  try 
    ytdl("http://www.youtube.com/watch?v=" + videoID, 
      quality: quality,
      filter: "audioonly",
    ).pipe(res);
   catch (e) 
    res.status(500).send("Encountered Error: " + e.message);
  
);

这里是代码 我将整个事情包裹在一个 try catch 块中,但仍然无法处理 Promise Rejection 感谢任何指针。

如果有帮助,这里是堆栈跟踪:

(node:1752) UnhandledPromiseRejectionWarning: Error: No such format found: asdasd
    at Object.exports.chooseFormat (D:\Code and Other Things\YTAudiostream\node_modules\ytdl-core\lib\format-utils.js:168:11)
    at downloadFromInfoCallback (D:\Code and Other Things\YTAudioStream\node_modules\ytdl-core\lib\index.js:86:26)
    at D:\Code and Other Things\YTAudioStream\node_modules\ytdl-core\lib\index.js:20:5
    at runMicrotasks (<anonymous>)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)

我知道我提供了一个无效的质量参数,这是故意的,我想在我的代码中处理这个拒绝

【问题讨论】:

【参考方案1】:

ytdl 返回一个可读流,处理流错误有点棘手。你需要使用.on()来检测错误,所以:

ytdl("http://www.youtube.com/watch?v=" + videoID, 
  quality: quality,
  filter: "audioonly",
).on('error', (err) => console.log(err)).pipe(res);

但是如果你真的想使用 try-catch 那么我想你可以自己扔它:

ytdl("http://www.youtube.com/watch?v=" + videoID, 
  quality: quality,
  filter: "audioonly",
).on('error', (err) => throw err).pipe(res);

【讨论】:

这就像一个魅力!不知道可读流发出错误事件而不是抛出错误!我今天学到了一些新东西:)

以上是关于无法使用 try-catch 处理未处理的 Promise Rejection的主要内容,如果未能解决你的问题,请参考以下文章

Java中未处理的异常错误,即使使用try-catch也是如此

从不用 try-catch 实现的 async/await 语法说错误处理

C# 无法避免嵌套的 try-catch

Java异常处理只有Try-Catch吗?

从不用 try-catch 实现的 async/await 语法说错误处理

如何使用 redux-thunk 和 try-catch 处理多个调度结果?