Exceptional Flow Control
Posted: Sat, 7 July 2007 | permalink | No comments
(or: finally, a use for ActiveRecord#save!)
I recently found Rescue To The Rescue!, a short article on structuring your Rails controllers differently.
Today, I started using it in some code I was writing that I think really benefitted from the change. The code was a big case that did things like this:
case some_variable
when 'X'
process-based-on-X
if save
post-processing
else
throw_an_error
end
when 'Y'
process-based-on-Y
if save
some-other-post-processing
else
throw_an_error
end
when 'Z'
process-based-on-Z
if !save
throw_an_error
end
end
In each case, the pre-save processing was unique, and -- more importantly -- the action to take after a successful save was different, so I couldn't just save-and-handle after the case statement. However, the throw_an_error code was the same in each case, so I just changed the code to do this:
begin
case some_variable
when 'X'
process-based-on-X
save!
post-processing
when 'Y'
process-based-on-Y
save!
some-other-post-processing
when 'Z'
process-based-on-Z
save!
end
rescue ActiveRecord::InvalidRecord
throw_an_error
end
My mind was blown. Soooo much clearer now. I have an "everything's OK" code path, and a "bugger me, something broke" path, cleanly separated.
But something didn't feel quite right...
And now I know what it is. I'm bothered by the fact that I'm sailing very close to using exceptions as an ordinary, every day flow control mechanism. I think I've convinced myself that, in this case, it's OK, but I'm a little concerned that I might go power-hungry and start using it in places that it really isn't warranted. I guess I'll just have to keep an eye on myself.
Just remember, everyone: save! isn't a dirty word!
Comments on this post are closed.