2005年04月03日

SOAP&Rubyでのエラー処理

Ruby上のSOAPの場合、サーバ上のエラーをクライアント側でどのように検知するか、と言う話。簡単に言うと
  • raiseされる例外クラスが、サーバとクライアントで共に定義されている場合:クライアントでもその例外クラスをrescueすることができる
  • そうでない場合:クライアント側ではRunTimeErrorとして扱われる
ということだ。では、例題プログラムで確認しよう。まず、サーバ側:

#!/usr/bin/env ruby
require 'webrick'
require 'soap/rpc/httpserver'
require 'soap/rpc/driver'

class MyError < StandardError; end

class RAServer < SOAP::RPC::HTTPServer
  def on_init
   @log.level = Logger::Severity::DEBUG
   add_method(self,'myerror')
  end

  def myerror
    raise MyError,"This is an error."
    return 0
  end
end

server = RAServer::new(
                       :SOAPHTTPServerApplicationName => "myerror",
                       :SOAPDefaultNamespace => "http://localhost/soap/",
                       :BindAddress => "0.0.0.0",
                       :Port => 1969,
                       :AccessLog => []
                       )


trap(:INT) do
  server.shutdown
end

server.start
要するに、独自に定義したMyErrorをraiseするサービスだ。次にクライアント側:
#!/usr/bin/env ruby
require 'webrick'
require 'soap/rpc/httpserver'
require 'soap/rpc/driver'

class MyError < StandardError; end

s = SOAP::RPC::Driver::new("http://localhost:1969/","http://localhost/soap/")
s.add_method("myerror")
s.wiredump_file_base = "myerror"
s.options["protcol.http.receive_timeout"]=300

ret = s.myerror
では実行してみよう。まずサーバ側を実行すると、正しく起動される。続いてクライアント側を実行する。
fujino@chimera{~/Works/MyError}$ ./error-client.rb
./error-server.rb:15:in `myerror': This is an error. (MyError)
        from /CACAnet/app/ruby-1.8.2/lib/ruby/1.8/soap/rpc/router.rb:259:in `call'
        from /CACAnet/app/ruby-1.8.2/lib/ruby/1.8/soap/rpc/router.rb:259:in `rpc_call'
        from /CACAnet/app/ruby-1.8.2/lib/ruby/1.8/soap/rpc/router.rb:240:in `call'
        from /CACAnet/app/ruby-1.8.2/lib/ruby/1.8/soap/rpc/router.rb:86:in `route'
        from /CACAnet/app/ruby-1.8.2/lib/ruby/1.8/soap/rpc/soaplet.rb:108:in `do_POST'
        from /CACAnet/app/ruby-1.8.2/lib/ruby/1.8/soap/rpc/soaplet.rb:103:in `with_headerhandler'
        from /CACAnet/app/ruby-1.8.2/lib/ruby/1.8/soap/rpc/soaplet.rb:103:in `do_POST'
        from /CACAnet/app/ruby-1.8.2/lib/ruby/1.8/webrick/httpservlet/abstract.rb:35:in `__send__'
         ... 15 levels...
        from /CACAnet/app/ruby-1.8.2/lib/ruby/1.8/soap/rpc/driver.rb:275:in `call'
        from /CACAnet/app/ruby-1.8.2/lib/ruby/1.8/soap/rpc/driver.rb:302:in `myerror'
        from /CACAnet/app/ruby-1.8.2/lib/ruby/1.8/soap/rpc/driver.rb:297:in `myerror'
        from ./error-client.rb:13
fujino@chimera{~/Works/MyError}$
というわけで、クライアント側でもMyErrorが定義してあるので、MyErrorをrescueできている。 Posted by fujino at 2005年04月03日 14:54 | TrackBack
Comments
Post a comment









Remember personal info?