Try catch 块没有捕获 node.js 中的错误
Try catch block doesn`t catch error in node.js
class AuthController {
static methods = {
GET: {
'/auth/signup': {
func: AuthService.signUp,
response: (data, res) => {
res.statusCode = 200;
res.end(JSON.stringify(data));
},
},
},
};
static use(req, res) {
const route = this.methods[req.method][req.url];
if (!route) {
res.statusCode = 404;
res.end(JSON.stringify({ message: 'Not found 404!' }));
return;
}
try {
const data = JSON.parse(req?.body?.data || '{}');
const result = route.func({ ...data });
route.response(result, res);
} catch (err) {
console.log(err, 'here');
res.statusCode = err.statusCode || 500;
res.end(JSON.stringify(err.message));
}
}
}
class AuthService {
static async signUp({ login, password }) {
if (!login || !password) throw new BaseError(400, 'kl', 'Custom error');
}
}
它在控制台中显示错误,但 try catch 块看不到它。
Here is the traceback。
我不知道是什么原因,因为抛出错误的函数在块内部。请帮忙!
我看到一个问题。您已将 signUp()
声明为 async
。这意味着它总是 returns 一个承诺,并且它意味着它内部的任何 throw
操作都会拒绝它 returns 的承诺(异常不会同步传播)。但是,当您尝试在此处调用它时:
const result = route.func({ ...data });
你没有 await
它所以当 signUp()
拒绝时,承诺进入 result
,但没有人处理承诺被拒绝的事实,你得到 UnhandlePromiseRejectionWarning
来自系统。
我看不到(所有其他路线的)整体设计,但也许您只需要添加 await
到此:
const result = await route.func({ ...data });
而且,你必须让 .use()
也成为 async
。
或者,如果 signUp()
实际上不需要是 async
,那么只需从它的声明中删除 async
并且 throw
将是同步的(而不是变成被拒绝的承诺)然后你的 try/catch
会抓住它。
您附加的回溯会告诉您确切的问题是什么以及您需要做什么:
This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch()
您无法捕获异步函数抛出的异常,该函数在该函数外部带有 try..catch
块,因为脚本执行在异步执行完成之前到达 catch 块。因此,您必须改用 .catch(..)
:
const result = route.func({ ...data }).catch((err) => {
console.log("catched error: ", err);
});
class AuthController {
static methods = {
GET: {
'/auth/signup': {
func: AuthService.signUp,
response: (data, res) => {
res.statusCode = 200;
res.end(JSON.stringify(data));
},
},
},
};
static use(req, res) {
const route = this.methods[req.method][req.url];
if (!route) {
res.statusCode = 404;
res.end(JSON.stringify({ message: 'Not found 404!' }));
return;
}
try {
const data = JSON.parse(req?.body?.data || '{}');
const result = route.func({ ...data });
route.response(result, res);
} catch (err) {
console.log(err, 'here');
res.statusCode = err.statusCode || 500;
res.end(JSON.stringify(err.message));
}
}
}
class AuthService {
static async signUp({ login, password }) {
if (!login || !password) throw new BaseError(400, 'kl', 'Custom error');
}
}
它在控制台中显示错误,但 try catch 块看不到它。 Here is the traceback。 我不知道是什么原因,因为抛出错误的函数在块内部。请帮忙!
我看到一个问题。您已将 signUp()
声明为 async
。这意味着它总是 returns 一个承诺,并且它意味着它内部的任何 throw
操作都会拒绝它 returns 的承诺(异常不会同步传播)。但是,当您尝试在此处调用它时:
const result = route.func({ ...data });
你没有 await
它所以当 signUp()
拒绝时,承诺进入 result
,但没有人处理承诺被拒绝的事实,你得到 UnhandlePromiseRejectionWarning
来自系统。
我看不到(所有其他路线的)整体设计,但也许您只需要添加 await
到此:
const result = await route.func({ ...data });
而且,你必须让 .use()
也成为 async
。
或者,如果 signUp()
实际上不需要是 async
,那么只需从它的声明中删除 async
并且 throw
将是同步的(而不是变成被拒绝的承诺)然后你的 try/catch
会抓住它。
您附加的回溯会告诉您确切的问题是什么以及您需要做什么:
This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch()
您无法捕获异步函数抛出的异常,该函数在该函数外部带有 try..catch
块,因为脚本执行在异步执行完成之前到达 catch 块。因此,您必须改用 .catch(..)
:
const result = route.func({ ...data }).catch((err) => {
console.log("catched error: ", err);
});