From: shout@... Date: 2019-06-20T19:17:25+00:00 Subject: [ruby-core:93286] [Ruby trunk Feature#15936] on_error in lieu of rescue, raise Issue #15936 has been updated by kylemacey (Kyle Macey). jeremyevans0 (Jeremy Evans) wrote: > kylemacey (Kyle Macey) wrote: > > What would be a thought on using another keyword that doesn't actually _rescue_ an exception, but performs an operation in the event of an error? Similar to `ensure`, but only in the event of an error. > > > > ``` > > begin > > some_method > > on_error StandardError > > job.fail! > > end > > ``` > > Thankfully, Ruby already supports what you want: > > ```ruby > begin > some_method > ensure > job.fail! if $! # or use case $! if you want to handle specific exception classes differently > end > ``` > > As you can already accomplish this with current Ruby syntax, I do not think adding a keyword for it is warranted. `ensure` fires even if there is no exception. This keyword would only fire when there is an exception. In your example, `job.fail!` would always be called. ---------------------------------------- Feature #15936: on_error in lieu of rescue, raise https://bugs.ruby-lang.org/issues/15936#change-78754 * Author: kylemacey (Kyle Macey) * Status: Open * Priority: Normal * Assignee: * Target version: ---------------------------------------- A common bad pattern in ruby is to rescue any exception and accidentally clobber the exception. ``` begin some_method rescue StandardError # end ``` Most linters will complain if you write rescues like the code above. However, this could be useful if we want to perform an operation on _any_ error, as long as we re-raise the exception after doing our work. ``` begin some_method rescue StandardError job.fail! raise end ``` Here, though, we run the risk of potentially forgetting to reraise the exception, or having to make exceptions in our linter for an operation that is overall benign. What would be a thought on using another keyword that doesn't actually _rescue_ an exception, but performs an operation in the event of an error? Similar to `ensure`, but only in the event of an error. ``` begin some_method on_error StandardError job.fail! end ``` (obviously, someone more creative than me should come up with a better name) -- https://bugs.ruby-lang.org/ Unsubscribe: