嵌套的)try / catch / finally块中的nodejs中的处理错误"/>
在(嵌套的)try / catch / finally块中的nodejs中的处理错误
我正在重构我的nodejs代码。我正在使用node-postgres实现事务。我的代码现在看起来像这样:
const controller = async (req, res, next) => {
const client = await pool.connect()
try {
// get the user ID out of the params in the URL
const { user_id } = req.params
let query, values, result
try {
await client.query('BEGIN')
} catch (err) {
throw new CustomError(err)
}
try {
query = 'QUERY_1'
values = ['VALUES_1']
result = await client.query(query, values)
} catch (err) {
throw new CustomError(err)
}
// handle some stuff
try {
query = 'QUERY_2'
values = ['VALUES_2']
result = await client.query(query, values)
} catch (err) {
throw new CustomError(err)
}
// handle some more stuff
try {
await client.query('COMMIT')
} catch (err) {
throw new CustomError(err)
}
return res.status(200).json({ response: 'ok' })
} catch (err) {
await client.query('ROLLBACK')
return next(new CustomHandleError(400, 'something_went_wrong'))
} finally {
client.release()
}
}
此代码有效,但我有一些疑问。我是nodejs的初学者。
1]在我的“最终”代码块中,我将客户端释放回池中。但是,如果一切正常,我将在“ try”块中返回响应。在线我读到“ finally”块总是被执行,所以可以在try块中返回一个(好的)响应,并在finally块中释放客户端吗?
2)是否可以嵌套多个try catch块(是否是反模式)?原因是node-postgres会引发错误,但是我想将所有错误返回给自定义错误处理程序,因此我先捕获了这些错误,然后再次将其引发到我的CustomError处理程序中。
提前感谢!
回答如下:由于所有内部catch
块都执行相同的操作,因此没有必要,因此可以大大简化try / catch的处理:
const controller = async (req, res, next) => {
const client = await pool.connect()
try {
// get the user ID out of the params in the URL
const { user_id } = req.params
let query, values, result;
await client.query('BEGIN');
query = 'QUERY_1'
values = ['VALUES_1']
result = await client.query(query, values)
// handle some stuff
query = 'QUERY_2'
values = ['VALUES_2']
result = await client.query(query, values)
// handle some more stuff
await client.query('COMMIT')
return res.status(200).json({ response: 'ok' })
} catch (err) {
await client.query('ROLLBACK')
return next(new CustomHandleError(400, 'something_went_wrong'))
} finally {
client.release()
}
}
然后,对您的问题:
1]在我的“最终”代码块中,我将客户端释放回池中。但 一切正常后,我在“ try”块中返回响应。 在线我读到,“ finally”块总是被执行,所以可以吗 在try块中返回(良好)响应并释放客户端 在最后一块吗?
是,这是finally
的很好的用法。
2)是否可以嵌套多个try catch块(是否是反模式)?原因是node-postgres会引发错误,但是我想将所有错误返回给自定义错误处理程序,因此我先捕获了这些错误,然后再次将其引发到我的CustomError处理程序中。
没关系(当它达到特定目标时不是反模式),但是在这种情况下是没有必要的,因为所有内部catch()
块都做相同的事情,并且都被外部catch块捕获,因此您可以保持外部捕获并摆脱所有内部捕获。如果您的所有await
语句在我的代码中拒绝,则它们将直接转到外部的catch
,在上面的代码中,您使用内部的catch语句仍在执行所有操作,因此它们是多余的。]
需要内部捕获的一些原因是:
您想要创建一个自定义错误(每个异步操作都不同),您将在函数的最终结果中实际使用该错误。
您想在本地“处理”错误,并继续处理不同的代码路径,而不仅仅是立即返回错误。例如,如果不存在配置文件,则尝试加载配置文件,捕获错误,然后使用默认值继续执行函数中的其余代码。
更多推荐
在(嵌套的)try / catch / finally块中的nodejs中的处理错误
发布评论