From: duerst Date: 2021-08-19T00:45:14+00:00 Subject: [ruby-core:104981] [Ruby master Feature#18083] Capture error in ensure block. Issue #18083 has been updated by duerst (Martin D�rst). 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 => 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 more stuff that makes this even more complicated doesn't look like an improvement of the language. (Go To Statement Considered Harmful, anybody?) - All the documentation/books that I can remember explain Exceptions and catch/throw completely separately (although usually in close proximity, because both features don't really fit anywhere). Some improvement seems in order, even if this is only "don't use them together". - `ensure` contains always executed code. Adding conditions to its syntax seems strange. It would be similar to extending the syntax of `else` (both in `if` expressions as well as in `begin` blocks). Specific conditions should be handled where we already have them, on `rescue`, e.g. like `rescue when throw` or some such (if at all). - The argument that Rubocop complains about something isn't really an argument. 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 tricky edge cases. As a general model, something like the following would be incredibly useful: ``` ruby begin ... ensure => error pp "error occurred" if error end ``` Currently you can get similar behaviour like this: ``` ruby begin ... rescue Exception => error raise ensure pp "error occurred" if error end ``` The limitation of this approach is it only works if you don't need any other `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` clause, 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: