The idea is that you change something before calling redo
or retry
, in the hopes that the whatever you were doing will work the second time. I don't have an example for redo
, but we have found uses for retry
in the application I'm working on. Basically, if you have a bit of code that might fail due to something external (e.g. network), but performing a precondition check every time you run the code would be too expensive, you can use retry
in a begin...rescue
block. Not sure if that was clear, so I'll get right to the example.
Basically, we have some code that accesses a remote directory using Net:SFTP
. The directory should exist, but in some exceptional cases it will not have been made yet. If it's not there, we want to try once to make it. But performing the network access to check if the directory exists every time would be too expensive, especially since it's only in exceptional cases that it won't be there. So we do it as follows:
tried_mkdir = false
begin
# Attempt to access remote directory
...
rescue Net::SFTP::StatusException
raise if tried_mkdir
tried_mkdir = true
# Attempt to make the remote directory
...
retry
end