Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Ruby程序中捕获java.sql.sqlexception?_Java_Sql_Ruby_Jruby - Fatal编程技术网

如何在Ruby程序中捕获java.sql.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={})

我肯定我在做些傻事。我使用的是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={})

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对象上失败。欢迎使用堆栈溢出!请花点时间编辑您的答案,包括一些解释,而不是简单地张贴一块代码。