最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

在(嵌套的)trycatchfinally块中的nodejs中的处理错误

网站源码admin22浏览0评论

在(嵌套的)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语句仍在执行所有操作,因此它们是多余的。]

需要内部捕获的一些原因是:

  1. 您想要创建一个自定义错误(每个异步操作都不同),您将在函数的最终结果中实际使用该错误。

  2. 您想在本地“处理”错误,并继续处理不同的代码路径,而不仅仅是立即返回错误。例如,如果不存在配置文件,则尝试加载配置文件,捕获错误,然后使用默认值继续执行函数中的其余代码。

发布评论

评论列表(0)

  1. 暂无评论