Not exactly so. According to the passage from RI below, "raise" with an exception class as a first paremeter accepts up to 2 additional parameters -- the first one will be used as an argument to new when the exception object is instantiated, and the second, if any, must be an array representing callback information.
When I need an exception class with more than one argument, I use something like the following:
class DimensionError < RuntimeError
attr_reader :width, :hight
def initialize(*args)
@width, @hight = *args
super "Wrong dimension #{width}x#{hight}"
end
end
begin
raise DimensionError, [ 5, 3 ]
rescue DimensionError => error
error.wigth
error.length
end
= OR =
class DimensionError < RuntimeError
attr_reader :width, :hight
def initialize(options = {})
@width = options[:width]
@hight = options[:hight]
super "Wrong dimension #{width}x#{hight}"
end
end
begin
raise DimensionError, :width => 5, :hight => 3
rescue DimensionError => error
error.wigth
error.length
end
----------------------------------------------------------- Kernel#raise
raise
raise(string)
raise(exception [, string [, array]])
fail
fail(string)
fail(exception [, string [, array]])
···
On Mar 23, 2010, at 2:45 PM, Robert Klemme wrote:
On 03/23/2010 06:22 PM, Nathan Beyer wrote:
What's the distinction between:
raise ArgumentError, "the argument was invalid"
and
raise ArgumentError.new("the argument was invalid")
How does this apply in the case of exceptions with custom initializers
for attributes? For example:
class StatusCodeError < StandardError
attr_reader :status_code
def initialize(status_code)
@status_code = status_code
end
end
I've been reading a lot of code, books and blogs, but haven't gotten
as clear of an understanding on why people choose one way over
another, so I'm looking for additional opinions and commentary.
I believe raise a,b,c,d... is merely syntactig sugar for raise
a.new(b,c,d...) with a bit of added functionality (e.g. if a is not an
exception class there is an error, if a is a String a StandardError is
raised).
------------------------------------------------------------------------
With no arguments, raises the exception in $! or raises a
RuntimeError if $! is nil. With a single String argument, raises a
RuntimeError with the string as a message. Otherwise, the first
parameter should be the name of an Exception class (or an object
that returns an Exception object when sent an exception message).
The optional second parameter sets the message associated with the
exception, and the third parameter is an array of callback
information. Exceptions are caught by the rescue clause of
begin...end blocks.
raise "Failed to create socket"
raise ArgumentError, "No parameters", caller
To answer your question, normally there is no reason to use a variant
with "new" - rather save yourself a bit of typing and use the shorter
form. My 0.02EUR.
Kind regards
robert
--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/