From a402acbbb6e366a21554e8e9f74b05c4a4116621 Mon Sep 17 00:00:00 2001 From: seki Date: Sat, 11 Dec 2004 12:12:17 +0000 Subject: add DRbRemoteError. [ruby-list:40348], [ruby-list:40390] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@7535 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/drb/drb.rb | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) (limited to 'lib/drb') diff --git a/lib/drb/drb.rb b/lib/drb/drb.rb index eb2d0d1459..ace46b29aa 100644 --- a/lib/drb/drb.rb +++ b/lib/drb/drb.rb @@ -430,6 +430,15 @@ module DRb end end + class DRbRemoteError < DRbError + def initialize(error) + @reason = error.class.to_s + super("#{error.message} (#{error.class})") + set_backtrace(error.backtrace) + end + attr_reader :reason + end + # Class wrapping a marshalled object whose type is unknown locally. # # If an object is returned by a method invoked over drb, but the @@ -539,12 +548,12 @@ module DRb @argc_limit = config[:argc_limit] end - def dump(obj) # :nodoc: - obj = DRbObject.new(obj) if obj.kind_of? DRbUndumped + def dump(obj, error=false) # :nodoc: + obj = make_proxy(obj, error) if obj.kind_of? DRbUndumped begin str = Marshal::dump(obj) rescue - str = Marshal::dump(DRbObject.new(obj)) + str = Marshal::dump(make_proxy(obj, error)) end [str.size].pack('N') + str end @@ -602,7 +611,7 @@ module DRb end def send_reply(stream, succ, result) # :nodoc: - stream.write(dump(succ) + dump(result)) + stream.write(dump(succ) + dump(result, !succ)) rescue raise(DRbConnError, $!.message, $!.backtrace) end @@ -612,6 +621,15 @@ module DRb result = load(stream) [succ, result] end + + private + def make_proxy(obj, error=false) + if error + DRbRemoteError.new(obj) + else + DRbObject.new(obj) + end + end end # Module managing the underlying network protocol(s) used by drb. -- cgit v1.2.3