如何在Ruby程序中捕获java.sql.sqlexception?
我肯定我在做些傻事。我使用的是Ruby 1.9.2-p312和jruby 1.6.8,默认设置为--1.9选项。这是我第一次尝试拯救SQLException。我故意通过拔下以太网连接使这段代码失败如何在Ruby程序中捕获java.sql.sqlexception?,java,sql,ruby,jruby,Java,Sql,Ruby,Jruby,我肯定我在做些傻事。我使用的是Ruby 1.9.2-p312和jruby 1.6.8,默认设置为--1.9选项。这是我第一次尝试拯救SQLException。我故意通过拔下以太网连接使这段代码失败 require 'java' require 'lib/jt400-6.1' require 'date' require 'bigdecimal' java_import 'com.ibm.as400.access.AS400JDBCDriver'def initialize(parms={})
require 'java'
require 'lib/jt400-6.1'
require 'date'
require 'bigdecimal'
java_import 'com.ibm.as400.access.AS400JDBCDriver'def initialize(parms={})
class DB
def initialize(parms = {})
begin
@connection ||= java.sql.DriverManager.get_connection "jdbc:as400://System/",parms[:user], parms[:pass]
rescue java.sql.SQLException
puts "Error connecting to iSeries. Error code: #{java.sql.SQLException.getErrorCode()}
SQL State: #{java.sql.SQLException.getSQLState()}."
end
end
end
这会产生以下错误:
NoMethodError - undefined method `getErrorCode' for Java::JavaSql::SQLException:Class:
/home/nick/Projects/OrderBridge/app/db.rb:17:in `initialize'
/home/nick/Projects/OrderBridge/app/order-processor.rb:208:in `prepare'
/home/nick/Projects/OrderBridge/app/orderbridge.rb:43:in `POST /advanced'
org/jruby/RubyMethod.java:117:in `call'
/home/nick/.rvm/gems/jruby-1.6.8/gems/sinatra-1.3.2/lib/sinatra/base.rb:1212:in `compile!'
org/jruby/RubyProc.java:258:in `call'
/home/nick/.rvm/gems/jruby-1.6.8/gems/sinatra-1.3.2/lib/sinatra/base.rb:785:in `route!'
/home/nick/.rvm/gems/jruby-1.6.8/gems/sinatra-1.3.2/lib/sinatra/base.rb:801:in `route_eval'
/home/nick/.rvm/gems/jruby-1.6.8/gems/sinatra-1.3.2/lib/sinatra/base.rb:785:in `route!'
/home/nick/.rvm/gems/jruby-1.6.8/gems/sinatra-1.3.2/lib/sinatra/base.rb:822:in `process_route'
org/jruby/RubyKernel.java:1226:in `catch'
/home/nick/.rvm/gems/jruby-1.6.8/gems/sinatra-1.3.2/lib/sinatra/base.rb:820:in `process_route'
/home/nick/.rvm/gems/jruby-1.6.8/gems/sinatra-1.3.2/lib/sinatra/base.rb:784:in `route!'
org/jruby/RubyArray.java:1620:in `each'
/home/nick/.rvm/gems/jruby-1.6.8/gems/sinatra-1.3.2/lib/sinatra/base.rb:783:in `route!'
/home/nick/.rvm/gems/jruby-1.6.8/gems/sinatra-1.3.2/lib/sinatra/base.rb:886:in `dispatch!'
/home/nick/.rvm/gems/jruby-1.6.8/gems/sinatra-1.3.2/lib/sinatra/base.rb:719:in `call!'
/home/nick/.rvm/gems/jruby-1.6.8/gems/sinatra-1.3.2/lib/sinatra/base.rb:871:in `invoke'
org/jruby/RubyKernel.java:1226:in `catch'
/home/nick/.rvm/gems/jruby-1.6.8/gems/sinatra-1.3.2/lib/sinatra/base.rb:871:in `invoke'
/home/nick/.rvm/gems/jruby-1.6.8/gems/sinatra-1.3.2/lib/sinatra/base.rb:719:in `call!'
/home/nick/.rvm/gems/jruby-1.6.8/gems/sinatra-1.3.2/lib/sinatra/base.rb:705:in `call'
/home/nick/.rvm/gems/jruby-1.6.8/gems/rack-1.4.1/lib/rack/methodoverride.rb:21:in `call'
/home/nick/.rvm/gems/jruby-1.6.8/gems/rack-protection-1.2.0/lib/rack/protection/xss_header.rb:22:in `call'
/home/nick/.rvm/gems/jruby-1.6.8/gems/rack-protection-1.2.0/lib/rack/protection/base.rb:47:in `call'
/home/nick/.rvm/gems/jruby-1.6.8/gems/rack-protection-1.2.0/lib/rack/protection/base.rb:47:in `call'
/home/nick/.rvm/gems/jruby-1.6.8/gems/rack-protection-1.2.0/lib/rack/protection/path_traversal.rb:16:in `call'
/home/nick/.rvm/gems/jruby-1.6.8/gems/rack-protection-1.2.0/lib/rack/protection/json_csrf.rb:17:in `call'
/home/nick/.rvm/gems/jruby-1.6.8/gems/rack-protection-1.2.0/lib/rack/protection/base.rb:47:in `call'
/home/nick/.rvm/gems/jruby-1.6.8/gems/rack-protection-1.2.0/lib/rack/protection/xss_header.rb:22:in `call'
/home/nick/.rvm/gems/jruby-1.6.8/gems/rack-1.4.1/lib/rack/session/abstract/id.rb:205:in `context'
/home/nick/.rvm/gems/jruby-1.6.8/gems/rack-1.4.1/lib/rack/session/abstract/id.rb:200:in `call'
/home/nick/.rvm/gems/jruby-1.6.8/gems/rack-1.4.1/lib/rack/nulllogger.rb:9:in `call'
/home/nick/.rvm/gems/jruby-1.6.8/gems/rack-1.4.1/lib/rack/head.rb:9:in `call'
/home/nick/.rvm/gems/jruby-1.6.8/gems/sinatra-1.3.2/lib/sinatra/showexceptions.rb:21:in `call'
/home/nick/.rvm/gems/jruby-1.6.8/gems/rack-1.4.1/lib/rack/lint.rb:48:in `_call'
/home/nick/.rvm/gems/jruby-1.6.8/gems/rack-1.4.1/lib/rack/lint.rb:36:in `call'
/home/nick/.rvm/gems/jruby-1.6.8/gems/rack-1.4.1/lib/rack/showexceptions.rb:24:in `call'
/home/nick/.rvm/gems/jruby-1.6.8/gems/rack-1.4.1/lib/rack/commonlogger.rb:20:in `call'
/home/nick/.rvm/gems/jruby-1.6.8/gems/rack-1.4.1/lib/rack/chunked.rb:43:in `call'
/home/nick/.rvm/gems/jruby-1.6.8/gems/rack-1.4.1/lib/rack/content_length.rb:14:in `call'
/home/nick/.rvm/gems/jruby-1.6.8/gems/rack-1.4.1/lib/rack/handler/webrick.rb:59:in `service'
/home/nick/.rvm/rubies/jruby-1.6.8/lib/ruby/1.9/webrick/httpserver.rb:111:in `service'
/home/nick/.rvm/rubies/jruby-1.6.8/lib/ruby/1.9/webrick/httpserver.rb:70:in `run'
/home/nick/.rvm/rubies/jruby-1.6.8/lib/ruby/1.9/webrick/server.rb:183:in `start_thread'
您希望将异常捕获到变量中
class DB
def initialize(parms = {})
begin
@connection ||= java.sql.DriverManager.get_connection "jdbc:as400://System/",parms[:user], parms[:pass]
rescue java.sql.SQLException => e
puts "Error connecting to iSeries. Error code: #{e.getErrorCode()}
SQL State: #{e.getSQLState()}."
end
end
end
这样,您就不会对异常的类调用.getErrorCode()
,而是调用异常的实例
您的问题在puts声明中。您引用的是异常类而不是对象,请重试
rescue java.sql.SQLException => e
puts "Error connecting to iSeries. Error code: #{e.getErrorCode()}
SQL State: #{e.getSQLState()}."
end
我遇到了类似的问题,并考虑分享我的解决方案,即使用“message”和“wrapped\u exception.error\u code”,如果需要,也可以使用它们
class DB
def initialize(parms = {})
begin
@connection ||= java.sql.DriverManager.get_connection "jdbc:as400://System/",parms[:user], parms[:pass]
rescue java.sql.SQLException => e
puts "Error message: #{e.message}
Msg: #{e.wrapped_exception.error_code}."
end
end
end
非常感谢。当我省略了SQLException方法时,这是可行的,但在其他方面仍然失败:未定义的方法“getErrorCode”for#在搜索了我的大脑和Google之后,我有两个建议。既然您已将
DriverManager.getConnection()
转换为DriverManager.get\u connection
,如果您尝试e.get\u error\u code
,该怎么办?另一个选择是找到一种可能有效的替代方法。我用MRI Ruby编写代码,通常需要用一些正则表达式解析e.message
,以获取数据库的错误代码。很抱歉,这么晚才回复。我回去尝试使用get_error_代码,但遗憾的是它也未定义。我继续前进,根本不调用这些方法,而是打印对象本身(#{e})。虽然不是最棒的,但至少它给了我关于失败的信息,而不是稍后在某个nil对象上失败。欢迎使用堆栈溢出!请花点时间编辑您的答案,包括一些解释,而不是简单地张贴一块代码。