繁体   English   中英

调试 PG::InFailedSqlTransaction

[英]Debug PG::InFailedSqlTransaction

一些背景

PG::InFailedSqlTransaction在某些 PG 异常被抢救并阻止事务回滚时出现。 简单的例子:

ActiveRecord::Base.transaction do
  ActiveRecord::Base.connection.execute('SELECT nothing FROM nowhere') rescue nil
  binding.pry # <- let's assume we're here
  User.count # raises PG::InFailedSqlTransaction
end

事务中的第一行静默地中断事务并继续,第一行之后的任何 SQL 语句都会引发PG::InFailedSqlTransaction: ERROR: current transaction is aborted, commands ignored until end of transaction block

问题

假设我们在上面的binding.pry断点上,有没有办法调试它并获取初始异常或任何其他数据?
不太清楚它是如何在后台实现的,但 PG 似乎很有可能缓存一些关于错误的元数据。

编辑:上面的代码只是一个演示一般问题的示例,问题是当我们无法轻易找到挽救异常的地方时如何获取错误

根据@engineersmnky 的评论,可以使用#error_message方法从PG::Connection实例中获取最后一条错误消息,该实例可以从ActiveRecord 连接中获取: ActiveRecord::Base.connection.raw_connection.error_message

如果我们从问题示例中的 pry 断点运行上述命令,它将返回以下消息:

ERROR:  relation "nowhere" does not exist
LINE 1: SELECT nothing FROM nowhere
                            ^

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM