From a1a2b66e0d9302f25b7636f93af9b83e0155eea0 Mon Sep 17 00:00:00 2001 From: seki Date: Fri, 28 Nov 2003 07:45:27 +0000 Subject: rescue SystemCallError git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5048 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/drb/drb.rb | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) (limited to 'lib/drb/drb.rb') diff --git a/lib/drb/drb.rb b/lib/drb/drb.rb index fda18401dd..20e17bd251 100644 --- a/lib/drb/drb.rb +++ b/lib/drb/drb.rb @@ -353,7 +353,13 @@ module DRb # Error raised when an error occurs on the underlying communication # protocol. - class DRbConnError < DRbError; end + class DRbConnError < DRbError + def self.new_with_error(cause) + conn_error = self.new(cause.message) + conn_error.set_backtrace(cause.backtrace) + conn_error + end + end # Class responsible for converting between an object and its id. # @@ -549,12 +555,20 @@ module DRb end def load(soc) # :nodoc: - sz = soc.read(4) # sizeof (N) + begin + sz = soc.read(4) # sizeof (N) + rescue + raise(DRbConnError.new_with_error($!)) + end raise(DRbConnError, 'connection closed') if sz.nil? raise(DRbConnError, 'premature header') if sz.size < 4 sz = sz.unpack('N')[0] raise(DRbConnError, "too large packet #{sz}") if @load_limit < sz - str = soc.read(sz) + begin + str = soc.read(sz) + rescue + raise(DRbConnError.new_with_error($!)) + end raise(DRbConnError, 'connection closed') if sz.nil? raise(DRbConnError, 'premature marshal format(can\'t read)') if str.size < sz begin -- cgit v1.2.3