Issue #18083 has been updated by duerst (Martin D=FCrst). Eregon (Benoit Daloze) wrote in #note-3: > If you only need to know if there is an `Exception` this seems easier: > Using the example from https://bugs.ruby-lang.org/issues/15567#note-27 > ```ruby > begin > ... > rescue Exception =3D> exception > transaction.abort > raise exception > ensure > transaction.commmit unless transaction.aborted? > end > ``` What about ```ruby begin ... rescue Exception transaction.abort else transaction.commit end ``` It seems shorter and easier to understand. Having read through most of #15567, my impression is that: - Ruby already has too many features for exceptional flow control. Adding m= ore stuff that makes this even more complicated doesn't look like an improv= ement of the language. (Go To Statement Considered Harmful, anybody?) - All the documentation/books that I can remember explain Exceptions and ca= tch/throw completely separately (although usually in close proximity, becau= se both features don't really fit anywhere). Some improvement seems in orde= r, even if this is only "don't use them together". - `ensure` contains always executed code. Adding conditions to its syntax s= eems strange. It would be similar to extending the syntax of `else` (both i= n `if` expressions as well as in `begin` blocks). Specific conditions shoul= d be handled where we already have them, on `rescue`, e.g. like `rescue whe= n throw` or some such (if at all). - The argument that Rubocop complains about something isn't really an argum= ent. If Rubocop is wrong, it should be fixed. ---------------------------------------- Feature #18083: Capture error in ensure block. https://bugs.ruby-lang.org/issues/18083#change-93381 * Author: ioquatix (Samuel Williams) * Status: Open * Priority: Normal ---------------------------------------- As discussed in https://bugs.ruby-lang.org/issues/15567 there are some tric= ky edge cases. As a general model, something like the following would be incredibly useful: ``` ruby begin ... ensure =3D> error pp "error occurred" if error end ``` Currently you can get similar behaviour like this: ``` ruby begin ... rescue Exception =3D> error raise ensure pp "error occurred" if error end ``` The limitation of this approach is it only works if you don't need any othe= r `rescue` clause. Otherwise, it may not work as expected or require extra = care. Also, Rubocop will complain about it. Using `$!` can be buggy if you call some method from `rescue` or `ensure` c= lause, since it would be set already. It was discussed extensively in https= ://bugs.ruby-lang.org/issues/15567 if you want more details. -- = https://bugs.ruby-lang.org/ Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=3Dunsubscribe> <http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>