From: "Eregon (Benoit Daloze)" Date: 2021-08-20T22:00:56+00:00 Subject: [ruby-core:105033] [Ruby master Feature#18083] Capture error in ensure block. Issue #18083 has been updated by Eregon (Benoit Daloze). > lots of code does need to make this differentiation. A few places, but in relative usages probably 1/1000 of begin/rescue or ensure/end patterns, right? Agreed `$!` should be deprecated and then removed. The only usage of `$!` I know of which can't be trivially replaced by `=> exc` is `p((abc rescue $!))` and that's 1) unpretty (double parens, modifier rescue) 2) only good for debugging / printing an exception in a quick script. It's easy enough to `begin; expr; rescue => exc; p exc; end` (or better, on multiple lines). Changing `$!` to be thread+frame local would likely be too incompatible so I think deprecating + removing it is better. ---------------------------------------- Feature #18083: Capture error in ensure block. https://bugs.ruby-lang.org/issues/18083#change-93442 * 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: