2012-10-23 19 views
1

我相信我在這裏做一些愚蠢的事情。我正在使用Ruby 1.9.2-p312,jruby 1.6.8以及--1.9選項設置爲默認值。這是我嘗試拯救SQLException的第一次嘗試。我特意通過拔掉以太網連接來使這段代碼失敗。如何在Ruby程序中捕獲java.sql.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' 

回答

2

你想捕獲異常到一個變量。

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()上異常的類,而是異常的實例。

Dealing with exceptions in jRuby

+0

謝謝!當我忽略了SQLException方法但是仍然失敗時,這種方法會失敗:undefined方法'getErrorCode'爲# Nicholas

+0

搜索我的大腦和Google後,我有兩個建議。由於您將'DriverManager.getConnection()'轉換爲'DriverManager.get_connection',所以如果您嘗試過'e.get_error_code'?另一個選擇是爲[NativeException]找到另一種方法(http://jruby.org/apidocs/org/jruby/NativeException.html),它可能有效。我在MRI Ruby中編寫代碼,我通常不得不用一些正則表達式來解析e.message來獲取數據庫的錯誤代碼。 –

+0

對不起,這個遲到的答覆..我回去嘗試使用get_error_code,但它也是未定義的。我繼續調用這些方法並打印對象本身(#{e})。不是最大的,但至少它給了我關於失敗的信息,而不是稍後在某些零對象上失敗。 – Nicholas

0

你的問題是在放聲明。您指的是異常類不是對象,請嘗試

rescue java.sql.SQLException => e 
    puts "Error connecting to iSeries. Error code: #{e.getErrorCode()} 
      SQL State: #{e.getSQLState()}." 
end 
相關問題