On Friday, 7 July 2017 at 18:48:31 UTC, Marco Leise wrote:
Am Thu, 06 Jul 2017 13:16:23 +0000
schrieb Moritz Maxeiner <[email protected]>:

That's right, but still one can distill general ideas and leave implementations details aside. Pretty much like the Platonic Ideal. Then you look at what the complaints are with the current implementation and see if you can satisfy all sides.

The requirement checked exceptions impose on all functions to declare their respective exception set is not an implementation detail, but part of the definition. With regards to the general ideas: That's what my writing about exception sets, tehir inference, and nothrow analysis were (supposed to be) about. Unless, however, whatever one eventually tries to get into the language (if that is even attempted) conforms to the preexisting definition of checked exceptions (which I'm as certain as I can reasonably be won't make it into D), calling it that will only serve to cloud the issue and alienate people. Personally, I would call a system with the exception set of a function being (optionally) declarable as "declarable exceptions", but that might still be too close to "checked exceptions" not to illicit screams of horror.


[...]

I.e. everything stays the same until a programmer needs a verification of what (s)he should/could handle right away, what needs to be wrapped and what can be passed further up the call chain. That's close to impossible now in deeply nested code.

If one replaces the `@check_exceptions` with `nothrow` the above is essentially what one should get if one enhances the (static) nothrow analysis (as I mentioned in an earlier post) to essentially treat a scope implicitly as nothrow if the aggregated exception set (as determined by the compiler) is empty.
Or more succinct: Infer `nothrow` for normal functions, as well.

In other cases an exception is only thrown when an incorrect argument is passed. Knowing (statically) that you pass only good values you can catch the exception and turn it into an assert instead of passing it up the call chain, potentially allowing the caller to be nothrow.

There are two cases here:
 - the function takes untrusted user data:
Violations are valid runtime behaviour -> Exceptions, error codes, split in validation and processing function pair with the second being executed only after the first has successfully validated the input data (and thus transformed it into trusted program data), etc.
 - the function takes trusted program data:
   Violations are bugs -> assert, Error, DbC, etc.

Reply via email to