【发布时间】:2021-10-20 08:38:44
【问题描述】:
我正在编写一个脚本来通过 API 从 Google Cloud 指标中提取数据,当时我意外地发现我不知道如何正确捕获异步函数的错误。 :O
这是来自谷歌云的示例代码:
// Imports the Google Cloud client library
const monitoring = require('@google-cloud/monitoring');
// Creates a client
const client = new monitoring.MetricServiceClient();
/**
* TODO(developer): Uncomment and edit the following lines of code.
*/
const projectId = 'XXXXXXXXX';
async function getMetrics() {
const request = {
name: client.projectPath(projectId),
filter: 'metric.type="cloudsql.googleapis.com/database/cpu/utilization"',
interval: {
startTime: {
// Limit results to the last 20 minutes
seconds: Date.now() / 1000 - 60 * 1,
},
endTime: {
seconds: Date.now() / 1000,
},
},
// Don't return time series data, instead just return information about
// the metrics that match the filter
view: 'HEADERS',
};
// Writes time series data
console.log('start')
const [timeSeries] = await client.listTimeSeries(request);
console.log('Found data points for the following instances:');
timeSeries.forEach(data => {
console.log(data.metric.labels.instance_name);
});
}
getMetrics();
函数listTimeSeries 返回一个承诺。我收到一个错误,我需要通过身份验证才能执行该操作,没有问题。
问题是我无法捕捉到该错误。
我尝试用 try {...} catch (err) {...} 块包围通话,没有被抓住。
我试图像这样const [timeSeries] = await client.listTimeSeries(request).catch(console.log); 抓住它 - 运气不好。
我一定是遗漏了一些东西,因为我对 nodeJS 还很陌生,并且不支持从异步函数中捕获错误。
我正在使用 nodeJS v14。
我错过了什么?
提前谢谢!
编辑
根据要求(@CherryDT),这是完整的错误输出:
我希望它不会太模糊。
编辑
事实证明,我一直在尝试捕获错误的方式很好。
问题的发生是因为listTimeSeries 函数(来自外部库)引发了错误,而不是拒绝了无法捕获的承诺。
谢谢各位。????
【问题讨论】:
-
他们俩都应该这样做。你能显示完整的错误信息和堆栈吗?也许它是异步抛出的(这意味着库中的一个错误)
-
听起来
client.listTimeSeries()的代码内部可能存在问题,并且它没有正确地将错误传播回调用者。 -
同意其他人认为它被奇怪地抛出,您是否有权访问 metric_service_client.js:220?可以提供一些见解
-
啊,是的,它可能在异步函数中抛出:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 在这种情况下转到“抛出错误时遇到问题”,我认为没有办法捕捉它
标签: node.js asynchronous error-handling async-await try-catch