[External] : Re: Proposal: Operator to "demote" checked exceptions
negora
public at negora.com
Thu Mar 17 12:07:08 UTC 2022
> Yes, the notion of "declarative checked exception wrapping" has been
> bouncing around the ecosystem for a long time (I think I even wrote a
> mail/RFE not unlike yours ~25 years ago about it, when I first
> arrived in the Java ecosystem.) As directions for reducing the pain
> of checked exceptions go, I agree it is a promising one.
Maybe I'm being too passionate, but I think that would be a game
changer for those of us who still use checked exceptions.
I admit that, from time to time, I feel tempted to use only unchecked
exceptions. But I still keep the hope that checked exceptions get
some love from the Java team and it becomes easier to work with them.
> what you suggest would introduce a painful asymmetry
True. I should have left only the example with the `wraps` keyword.
> So, please let's not try to design the feature here -- and
certainly let's not try to design the syntax here.
Sorry, it was just a quick idea. I'm not familiar with
this mailing list so I thought that type of matters could be
commented here.
Thank you.
On 16/03/2022 16:17, Brian Goetz wrote:
> Yes, the notion of "declarative checked exception wrapping" has been
> bouncing around the ecosystem for a long time (I think I even wrote a
> mail/RFE not unlike yours ~25 years ago about it, when I first arrived
> in the Java ecosystem.) As directions for reducing the pain of checked
> exceptions go, I agree it is a promising one.
>
> To answer the syntax question in your mail, what you suggest would
> introduce a painful asymmetry between
>
> catch (E1(E2))
>
> and
>
> throws E1(E2)
>
> because the nesting notation would mean two different things in the two
> places; in the first, describing only what is caught ("an E2 wrapped in
> an E1"), but in the latter, it is trying to say "if I throw an E2, catch
> it, and rewrap it in an E1, and throw that". I think it is too much of
> a stretch to try to reuse the same syntax for two different things.
>
> So, my summary is that this is an understood and plausible direction,
> and something we might consider at some point, but not a feature that we
> are currently pursuing. (Yes, we understand that checked exceptions can
> be painful.) So, please let's not try to design the feature here -- and
> certainly let's not try to design the syntax here.
>
>
>
> On 3/16/2022 5:12 AM, negora wrote:
>> Hi Brian. Thank you for your answer and apologizes for the delay.
>>
>> I must admit that, in a first stage of my proposal, my idea was about
>> adding some syntactic sugar to wrap/unwrap exceptions easily, without
>> the need of try-catch blocks. But that led me to the idea of removing
>> the need of wrapping altogether and, hence, propose the feature of
>> switchable checked exceptions.
>>
>> My initial proposal looked like this:
>>
>> ```
>> public Student parseStudent (String line)
>> throws StudentException
>> wraps IOException, ParseException {
>> // Code.
>> }
>> ```
>>
>> Instead of this:
>>
>> ```
>> public Student parseStudent (String line) {
>> try {
>> // Code.
>> } catch (IOException | ParseException ex) {
>> throw new StudentException (ex);
>> }
>> }
>> ```
>>
>> Obviously, the wrapper exception should provide at least
>> one constructor with a single parameter of type `Throwable`.
>> And the signature of the method would not include
>> the `wraps` clause.
>>
>> Maybe it's just me, but try-catch blocks introduce visual
>> complexity that distracts me while reading the body of a method.
>> It could be alleviated **a lot** with this.
>>
>> From my experience, many try-catch blocks are just
>> to wrap checked exceptions between abstraction layers,
>> so this would be very helpful in many parts of our code bases.
>> In practice, the use of try-catch blocks would be reduced
>> to those situations in which we need to do something
>> different from just wrapping an exception.
>>
>> In contrast to the proposal of switchable exceptions, this
>> syntax couldn't be directly applied to lambdas. But at least
>> one could extract the code to a new method and keep it cleaner
>> that with a try-catch.
>>
>> > One context that could become pattern-aware is catch. And
>> > deconstruction patterns compose, so we could give exceptions
>> > deconstruction patterns to match their wrapping constructors, so that
>> > you could say
>> >
>> > catch (RuntimeException(SqlException se)) { … }
>> >
>> > which reduces the syntactic overhead of unwrapping to basically
>> > zero.
>>
>> That sounds interesting. But, Could the opposite concept be carried
>> to the `throws` clause? I mean, a construction pattern
>> instead of a deconstruction one. Something similar to
>> my first example, but without the need of a new keyword:
>>
>> ```
>> public Student parseStudent (String line)
>> throws StudentException (IOException | ParseException) {
>> // Code.
>> }
>> ```
>>
>> I really prefer the use of the `wraps` keyword, but I understand
>> that introducing a new keyword has lots of side-effects.
>>
>>
>>
>> On 07/03/2022 21:38, Brian Goetz wrote:
>>> Not going to engage on the “should we give people the opportunity to
>>> turn off checked exceptions”, but I will make a few comments on how
>>> we might reduce the accidental cost of wrapping and unwrapping
>>> exceptions.
>>>
>>>> 3. If you want to rethrow the original exceptions, you're forced to
>>>> catch the wrapper first, and then analyse and downcast the wrapped
>>>> exceptions.
>>>
>>> We’re in the process of adding pattern matching to the language, in
>>> stages. Currently patterns are restricted to type patterns, and
>>> pattern-aware contexts are restricted to instanceof and switch, but
>>> both categories will expand over time.
>>>
>>> One context that could become pattern-aware is catch. And
>>> deconstruction patterns compose, so we could give exceptions
>>> deconstruction patterns to match their wrapping constructors, so that
>>> you could say
>>>
>>> catch (RuntimeException(SqlException se)) { … }
>>>
>>> which reduces the syntactic overhead of unwrapping to basically
>>> zero. I’m much more compelled by directions like this, which embrace
>>> the tools we have, but reduce their accidental impact. (Obviously
>>> there’s work to do to make everything about wrapping this smooth.)
>
More information about the amber-dev
mailing list