From: Leslie Viljoen on 6 Apr 2010 10:44 [Note: parts of this message were removed to make it a legal post.] Hi everyone I want to make a custom exception like so: class BillRowError < StandardError def initialize(field, index) @field = field @index = index end end I'll call this like so: raise(BillRowError.new(:roamingcalls, @index), "Roaming Calls field missing") if n.length == 0 But now I'd like to be able to modify the string that Ruby prints when the exception is not rescue'd. I thought I could add this method to the BillRowError class: def message @message + " field: #{@field}, row: #{@index}" end That almost works but I get a "instance variable @message not initialized" warning, which means Ruby is not setting @message in my object like I expected. Making my own message= method doesn't help. Can an exception object access and modify the message that gets passed in the "raise"?
From: Chris Hulan on 6 Apr 2010 11:22 On Apr 6, 10:44 am, Leslie Viljoen <leslievilj...(a)gmail.com> wrote: > [Note: parts of this message were removed to make it a legal post.] > > Hi everyone > > I want to make a custom exception like so: > > class BillRowError < StandardError > def initialize(field, index) > @field = field > @index = index > end > end > > I'll call this like so: > raise(BillRowError.new(:roamingcalls, @index), "Roaming Calls field > missing") if n.length == 0 > > But now I'd like to be able to modify the string that Ruby prints when the > exception is not rescue'd. I thought I could add this method to the > BillRowError class: > > def message > @message + " field: #{@field}, row: #{@index}" > end > > That almost works but I get a "instance variable @message not initialized" > warning, which means Ruby is not setting @message in my object like I > expected. Making my own message= method doesn't help. > > Can an exception object access and modify the message that gets passed in > the "raise"? The default Exception:initialize is defined to take 1 parameter, a string containing the error message You define different initialize parameters so @message is not getting set as expected Maybe something like: class BillRowError < StandardError def initialize(msg, field, index) super(msg) @field = field @index = index end def message @message + " field: #{@field}, row: #{@index}" end end .... raise(BillRowError.new("Roaming Calls field missing",:roamingcalls, @index), ) if n.length == 0 cheers
From: Mario Antonetti on 6 Apr 2010 11:23 [Note: parts of this message were removed to make it a legal post.] On Tue, Apr 6, 2010 at 9:44 AM, Leslie Viljoen <leslieviljoen(a)gmail.com>wrote: > Hi everyone > > I want to make a custom exception like so: > > class BillRowError < StandardError > def initialize(field, index) > @field = field > @index = index > end > end > > I'll call this like so: > raise(BillRowError.new(:roamingcalls, @index), "Roaming Calls field > missing") if n.length == 0 > > But now I'd like to be able to modify the string that Ruby prints when the > exception is not rescue'd. I thought I could add this method to the > BillRowError class: > > def message > @message + " field: #{@field}, row: #{@index}" > end > > That almost works but I get a "instance variable @message not initialized" > warning, which means Ruby is not setting @message in my object like I > expected. Making my own message= method doesn't help. > > Can an exception object access and modify the message that gets passed in > the "raise"? > You could try rewriting the to_s method and take advantage of the inheritance: def to_s super + " field: #{@field}, row: #{@index}" end That worked for me. I'm not sure if this is the recommended solution.
From: Brian Candler on 6 Apr 2010 11:24 Judging by the C source, Exception uses hidden(*) instance variables "mesg" and "bt" for message and backtrace respectively. However, the accessor #message internally calls #to_s, which you can override. class BillRowError < StandardError def initialize(field, index) @field = field @index = index end alias :orig_to_s :to_s def to_s "#{orig_to_s} field: #{@field}, row: #{@index}" end end begin raise BillRowError.new(5, 7), "bar" rescue BillRowError => e p e p e.instance_variables p e.message p e.backtrace end Produces: #<BillRowError: bar field: 5, row: 7> ["@index", "@field"] "bar field: 5, row: 7" ["ert.rb:14"] Admittedly this behaviour doesn't seem to be well documented, so may be fragile. Use at your own risk. HTH, Brian. (*) It uses instance variables whose names don't begin with '@' and so cannot be accessed by normal code -- Posted via http://www.ruby-forum.com/.
From: Brian Candler on 6 Apr 2010 11:56 Chris Hulan wrote: > The default Exception:initialize is defined to take 1 parameter, a > string containing the error message But 'raise' also lets you pass an error message, in addition to the exception instance. Note that even the default constructor doesn't create an instance variable called @message. class Foo < StandardError end begin raise Foo, "bar" rescue Foo => e p e p e.instance_variables p e.instance_variable_get(:@message) p e.message p e.backtrace end #<Foo: bar> [] # << No instance variables! nil # << No @message! "bar" ["ert.rb:5"] -- Posted via http://www.ruby-forum.com/.
|
Next
|
Last
Pages: 1 2 Prev: Find a set of common elements from a multi-dimensional array Next: [ANN] splib 1.4.3 released |