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