例如,auth.getUsers()只允许数组作为参数,因此传递如下所示的字符串将导致错误,但catch子句不会被执行。
import { getAuth } from "firebase-admin/auth";
getAuth().getUsers("foo").catch(() => console.log("error"));
为什么会出现这种情况?
上面在try-catch中可以这样写。在这种情况下,catch 子句将被执行。
import { getAuth } from "firebase-admin/auth";
try {
getAuth().getUsers("foo");
} catch {
console.log("error");
}
您显示的两个代码示例不相同。
在第一个示例中,promise 上的 catch 方法仅捕获与该promise 的解决方案特别相关的错误。它不会捕获其他与语言相关的异常(例如编程错误,就像您犯的那样)。这些错误称为“引发的异常”,与被拒绝的承诺不同。如果返回 Promise 的函数存在一些与 Promise 的解决无关的内部问题或崩溃,则 Promise 可能永远不会返回,或者返回的 Promise 可能永远不会得到解决(
then
和 catch
回调都不是)调用)。
在你的第二个例子中,情况恰恰相反。 try/catch 实际上永远不会捕获对 getUsers 返回的承诺的拒绝,因为它不会等待该承诺解决。但是,它将捕获由 try 块中的任何同步代码引起的一般编程问题和崩溃。
如果您使用 async/await 语法,您的第二个示例将会更有用,这是 try/catch 对使用本机 JS 语法的 Promise 有用的唯一方法。当您使用await时,它会将被拒绝的promise转换为抛出的异常,以便catch子句可以捕获它。此外,您还应该考虑为生成的异常分配一个变量,以便您可以获得有关出错原因的更多信息。
try {
await getAuth().getUsers("foo");
} catch(e) {
console.log("error", e);
}
上面将捕获与 javascript 相关的编程错误,以及对 getUsers 返回的承诺的拒绝。由您检查
e
变量来确定它是哪种类型的错误,因为它可能是其中之一。当然,为了使用await,代码本身必须位于异步函数中。
底线:promise 的 catch() 回调与 try/catch 中的 catch 处理程序不同(即使它们具有相同的名称)。
您可能需要查看一些参考文档: