Actions
Feature #5818
closedFeature: Raiseable
    Feature #5818:
    Feature: Raiseable
  
Status:
Rejected
Assignee:
-
Target version:
-
Description
= Proposal
The ability to raise any object that is a Raiseable.
= Problem
- The Exception subclass hierarchy is well-established.
 - CRuby does not allow any object that behaves as an Exception to be raised, it must be a subclass of Exception.
 - 3rd-party code often rescues Exception; e.g. for error recovery, retry and/or logging.
 - Users need the ability to raise objects that would not normally be rescued by any code;
e.g.: hard timeouts or custom signal handlers in an application. 
= Solution
- A "Raiseable" module implements all of the methods currently defined in Exception.
 - Exception class includes Raiseable module.
 - ruby/eval.c: make_exception() asserts rb_obj_is_kind_of(mesg, rb_mRaiseable),
instead of rb_obj_is_kind_of(mesg, rb_cException). - Users should avoid "rescue Raiseable" in usual circumstances.
 
= Other Ideas not implemented here:
- Remove the obj_is_kind_of(mesg, rb_mRaiseable) restriction to allow pure duck-typing.
 - Clean up the ivar names (@bt, @mesg) and method names (set_backtrace).
 
= Example
(({
raiseable = Class.new do
include Raiseable
def self.exception *args; new *args; end
end
begin
  raise raiseable, "this must be handled"
  assert(false)
rescue Exception
  assert(false)
rescue Raiseable
  assert(true)
end
}))
Files
        
          
          Updated by kstephens (Kurt  Stephens) almost 14 years ago
          
          
        
        
      
      
    
        
          
          Updated by matz (Yukihiro Matsumoto) almost 14 years ago
          
          
        
        
      
      Separate the proposal into two: (a) allow non-Exception object to be raised. (b) Raiseable. And I will refuse (b). Currently, I see no good reason for (a), but you can try to persuade me.
Matz.
        
          
          Updated by nobu (Nobuyoshi Nakada) almost 14 years ago
          
          
        
        
      
      - Status changed from Open to Rejected
 
Actions