inheriting from StandardError

10 views
Skip to first unread message

John Merlino

unread,
Sep 16, 2012, 2:57:19 PM9/16/12
to Ruby on Rails: Talk
I often see custom Exception classes inheriting from StandardError.
Errors which you can generally deal with are subclassed from
StandardError:

module AbstractController
class Error < StandardError #:nodoc:
end

class ActionNotFound < StandardError #:nodoc:
end

unless action_name = method_for_action(action_name)
raise ActionNotFound, "The action '#{action}' could not be found for
#{self.class.name}"
end

But why even bother to create the subclasses (which as shown above,
have no definition of themselves), when substituting ActionNotFound
with StandardError during the raise call will have the same effect.

John Merlino

unread,
Sep 16, 2012, 3:38:06 PM9/16/12
to Ruby on Rails: Talk
I would understand if there was some level of customization involved
that distinguishes it from the super class:

class DoubleRenderError < Error
DEFAULT_MESSAGE = "Render and/or redirect were called multiple
times in this action. Please note that you may only call render OR
redirect, and at most once per action. Also note that neither redirect
nor render terminate execution of the action, so if you want to exit
an action after redirecting, you need to do something like
\"redirect_to(...) and return\"."

def initialize(message = nil)
super(message || DEFAULT_MESSAGE)
end
end

But in the exampels I provided in the initial post that was not the
case. ActionNotFound, for example, had no implementation of its own.
It seems to be a waste of memory allocation.

Frederick Cheung

unread,
Sep 16, 2012, 4:02:41 PM9/16/12
to rubyonra...@googlegroups.com
On Sunday, September 16, 2012 7:57:44 PM UTC+1, John Merlino wrote:
  class ActionNotFound < StandardError #:nodoc:
  end

unless action_name = method_for_action(action_name)
  raise ActionNotFound, "The action '#{action}' could not be found for
#{self.class.name}"
end

But why even bother to create the subclasses (which as shown above,
have no definition of themselves), when substituting ActionNotFound
with StandardError during the raise call will have the same effect.

Because it doesn't have the same effect. Raising specific subclasses allows you to write targeted rescue clauses rather than rescuing indiscriminately.

Fred 

John Merlino

unread,
Sep 17, 2012, 2:23:28 PM9/17/12
to Ruby on Rails: Talk
So we must build an entire class just for sake of more specific rescue
statements:

class MyError < StandardError
end

try_counter = 0
begin
try_counter += 1
puts 'Here 1'
raise MyError.new "Text" unless try_counter > 5
puts 'Here 2'
rescue MyError
puts 'Here 3 - MyError encountered'
retry
rescue StandardError
puts "Here 4 - Other error encountered (#{$!.inspect})" +
caller.inspect
raise
else
puts 'Here 5 - No errors'
ensure
puts 'Here 6 - Always done'
end


On Sep 16, 4:02 pm, Frederick Cheung <frederick.che...@gmail.com>
wrote:
Reply all
Reply to author
Forward
0 new messages