From: "ioquatix (Samuel Williams)" Date: 2021-08-19T00:51:30+00:00 Subject: [ruby-core:104982] [Ruby master Feature#18083] Capture error in ensure block. Issue #18083 has been updated by ioquatix (Samuel Williams). > 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?) We are not implementing any additional flow control. > 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). Whether or not you agree with it, people already do it: https://bugs.ruby-lang.org/issues/15567#note-26 I want to make this use case safer, as I was bitten by this bug. The original discussion is a bit different but the surrounding context is similar. > The argument that Rubocop complains about something isn't really an argument. If Rubocop is wrong, it should be fixed. `rescue Exception` can produce unusual results that users might not expect, so I think RuboCop is correct here and we shouldn't encourage users to write `rescue Exception`. ---------------------------------------- Feature #18083: Capture error in ensure block. https://bugs.ruby-lang.org/issues/18083#change-93382 * 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: