to catch exception from update_attribute

Hi
begin
       ActiveRecord::Base.transaction do
         pb_status_history = ProblemStatusHistory.new
         pb_status_history.problem_id = @problem.id
         pb_status_history.problem_status_id =
@problem.problem_status_id
         pb_status_history.save!
         ret_val=@problem.update_attribute("problem_status_id",'ab')
         if ret_val==false
           raise ActiveRecord::ActiveRecordError
         end
       end # end of transaction
       rescue
       puts 'error is '+$!
end
         What I was trying to do above was to write a proper exception
handling for the above code.In Database table problem_status_id is an
integer field And I deliberatly wrote
@problem.update_attribute("problem_status_id",'ab') So what i expect was
an exception there and which will be caught by the raised as
raise ActiveRecord::ActiveRecordError
and will be caught by rescue..But that did not happen.Could u please
tell me where the error is .Also in above I am using save! and put the
whole code in transaction block..So if suppose pb_status_history.save!
also results an exception need I to write another rescue for that also
or a single rescue do all these?

Thanks in advance
Sijo

Hi
begin
      ActiveRecord::Base.transaction do
        pb_status_history = ProblemStatusHistory.new
        pb_status_history.problem_id = @problem.id
        pb_status_history.problem_status_id =
@problem.problem_status_id
        pb_status_history.save!
        ret_val=@problem.update_attribute("problem_status_id",'ab')
        if ret_val==false
          raise ActiveRecord::ActiveRecordError
        end
      end # end of transaction
      rescue
      puts 'error is '+$!
end
        What I was trying to do above was to write a proper exception
handling for the above code.In Database table problem_status_id is an
integer field And I deliberatly wrote
@problem.update_attribute("problem_status_id",'ab') So what i expect was
an exception there and which will be caught by the raised as

Unless you've got a validation or a foreign key constraint ActiveRecord won't care about that (i expect it would typecast it to 0 or something like that)

raise ActiveRecord::ActiveRecordError
and will be caught by rescue..But that did not happen.Could u please
tell me where the error is .Also in above I am using save! and put the
whole code in transaction block..So if suppose pb_status_history.save!
also results an exception need I to write another rescue for that also
or a single rescue do all these?

You don't need more than one rescue block although if you wanted to do different things in response to different exceptions then you'd typically have multiple rescue blocks. Another thing to note (although not relevant here) is that rescue with no arguments does not actually rescue all exceptions, only those that descend from StandardError.

Fred

You may want to try explicitly putting the word Exception in the rescue
statement as follows:

begin
  .
  .
rescue Exception
  .. your exception handing code, at least print out the sub-class
end

Once you determine which particular exception is actually being raised,
you may want to further refine your rescue clause and catch it before
you fall through to the generic Exception.

I do know that you don't need to explicitly mention a target for the
"rescue" statement. However, I have found it to be more consistent to
use at least a catch all Exception word explicitly.
Hope this helps.
Bharat