On Tuesday, 27 June 2017 at 06:10:52 UTC, Tobias Müller wrote:
Moritz Maxeiner <mor...@ucworks.org> wrote:
[...]
Or, more succinct: You must either manually write things down the
compiler could find out in a fraction of the time via static
analysis, or cheat the system; both cases are bad code.

It's not at all bad code to write things down that the compiler could
infer, quite the opposite.

Of course it is bad, because the compiler can do it better (no chance for a wrong exception set sans compiler bugs) and faster than you.

Writing it down signals _intent_ and the compiler can check if the implementation is matching the specification

Verifying that a function meets its specification is what unittests are for (asserts for runtime behaviour, static asserts for types). With a function set trait there's nothing stopping you from writing a template that allows you to do the following:

---
void foo() { ... }

unittest
{
    static assert (throws!(foo, AException));
    static assert (throwsAll!(foo, AException, BException));
    static assert (throwsAny!(foo, AException, CException));
    static assert (!throws!(foo, CException));
}
---

which would be idiomatic D, giving you not only the same guarantees as checked exceptions (without the downsides), but also even more versatility by allowing arbitrary checks on the exception set.

which gives you additional security.

This has nothing to do with security; you may be thinking of safety.

Additionally it allowes the compiler to do the checks locally which is much
easier.

Easier to implement in the compiler, yes. That's precisely why I called it a compiler deficiency compared to exposing the function exception set, which is more advanced.

Function signatures are interfaces which should be self-contained IMO, i.e. it should not be necessary to examine the function body. That's what signatures are for. At very least for public interfaces.

Sure, but since a function's signature in D does not include its exception set (be they checked or not), that point is moot.

I honestly don't understand how people that care a great deal about expressive type systems can be so opposed to checked exceptions. After all they wouldn't use 'object' for everything either.

For exactly the reasons I have already explained.

Reply via email to