Checked vs unchecked exceptions
Eugene Wissner via Digitalmars-d
digitalmars-d at puremagic.com
Sun Jun 25 11:00:46 PDT 2017
http://forum.dlang.org/post/ullvxbfqeuztwecxcygb@forum.dlang.org
On Sunday, 25 June 2017 at 17:38:14 UTC, mckoder wrote:
> I am disappointed that D doesn't have checked exceptions.
>
> C++ and C# also don't have checked exceptions. Java has checked
> exceptions. Having programmed extensively in all these
> languages I can say with confidence that checked exceptions is
> the most important thing missing in C++ and C#. Around the time
> C# was released there was a lot of debate around the topic of
> checked vs unchecked exceptions and this created an impression
> that Java's use of checked exceptions was "controversial". In
> fact it is a feature every modern language should have.
>
> Exceptions that can be thrown by a method should be part of the
> contract of that method. Changing the list of the list of
> exceptions that can be thrown by a method is just like changing
> the parameters of the method. This is something that should
> cause calling code to fail to compile. This will allow you to
> inspect the calling code and decode how to deal with the new
> exception.
>
> When the exception that can be thrown by a method is not known
> you don't know what exceptions to catch and what exceptions to
> pass through to callers. You can't rely on documentation
> because the documentation is not verified be the compiler and
> so is not reliable. All you can do is to run the program a few
> times, see what exceptions you get and handle them. Even if you
> are able to determine the full list of exceptions using this
> strategy, a future revision of the called method can throw a
> new exception and cause your program to crash. As a result, in
> large C# code bases it is common to see catching the base
> Exception class because this is the only way to prevent a
> crash. This causes exceptions to be "swallowed" because higher
> level code that is actually prepared to handle certain
> exceptions never get the exception.
>
> With Java this problem doesn't exist. When you call a function
> you know exactly what exceptions can be thrown and you can
> catch (or pass through) exactly those exceptions. There is no
> need to catch the base exception class.
>
> When you have multiple implementations of an interface (such as
> database connectivity layer) and each of those implementations
> can throw a completely disjoint set of exceptions there is no
> way to write polymorphic code that can recover from errors.
>
> Anders Hejlsberg, designer of C# doesn't think people care to
> catch specific exceptions, which is why C# doesn't have checked
> exceptions. (See http://www.artima.com/intv/handcuffs.html )
> "They're not going to handle any of these exceptions. There's a
> bottom level exception handler around their message loop. That
> handler is just going to bring up a dialog that says what went
> wrong and continue." Also: "The exception handling should be
> centralized.." In other words, he thinks all people want to do
> with exceptions is catch the base Exception class and display a
> message. I have a lot of respect for Anders Hejlsberg (my first
> programming language was Turbo Pascal) but he is completely
> wrong on this topic.
>
> Regarding the versioning issue discussed by Anders Hejlsberg,
> my response is that throwing a new exception is like changing
> the signature of a function. You want callers to be alerted
> that they need to update their code! This means the calling
> code should fail to compile until it is updated.
More information about the Digitalmars-d
mailing list