2012-10-23 2 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 메서드를 생략했지만 다른 방법으로는 실패합니다. # Nicholas

+0

에 대한 getErrorCode 정의되지 않은 메서드 getErrorCode 두뇌와 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}) 계속 진행했습니다. 가장 중대하지는 않지만 적어도 나중에 어떤 nil 오브젝트에 실패하지 않고 실패에 대한 정보를 제공합니다. – Nicholas

0

귀하의 문제는 풋 문입니다. 객체가 아닌 예외 클래스를 참조하고 있습니다.

rescue java.sql.SQLException => e 
    puts "Error connecting to iSeries. Error code: #{e.getErrorCode()} 
      SQL State: #{e.getSQLState()}." 
end 
관련 문제