我正在使用 find_by_sql 连接到 Postgres 数据库并执行数据库函数。数据库函数执行大量 SQL 语句并根据需要引发异常。
如何捕获 Rails 中 Postgres 函数引发的错误代码和错误消息?
def self.validate_email(systemuserid, emailaddress)
begin
result = (self.find_by_sql(["SELECT fn_systemuser_validate_email(?, ?) AS returncode",
systemuserid, emailaddress])).first
rescue => err
# I want to get access to the error code and error message here and act accordingly
# errno = ??
# errmsg = ??
if errno == 10000
end
end
return result[:returncode]
end
我开始尝试在连接对象中查找此信息 - 运气不佳。
非常感谢任何帮助。
最佳答案
当前事件记录用内部错误替换原始错误,而不用新错误传递原始错误。我不明白为什么会有人想要这个。
所以现在唯一的解决办法是猴子补丁;)
module ActiveRecord
module ConnectionAdapters
class AbstractAdapter
def translate_exception(e, message)
ActiveRecord::WrappedDatabaseException.new(message,e)
end
# Replaces
# def translate_exception(e, message)
# # override in derived class
# ActiveRecord::StatementInvalid.new(message)
# end
end
end
end
现在你可以获得original_exception。
def self.validate_email(systemuserid, emailaddress)
begin
result = (self.find_by_sql(["SELECT fn_systemuser_validate_email(?, ?) AS returncode", systemuserid, emailaddress])).first
rescue ActiveRecord::WrappedDatabaseException => e
pgerror = e.original_exception
# Exact api depends on PG version, check the docs for your version.
puts "Doing my stuff: #{pgerror.result.result_error_message}"
end
end
这适用于 pg 版本 0.11 和 Rails 3.0.9。可能会与更高版本一起使用。
关于ruby-on-rails - 使用 Rails 和 Postgres 时如何访问数据库错误信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8952189/