On 6/5/22 8:45 AM, kdevel wrote:
On Sunday, 5 June 2022 at 01:43:06 UTC, Steven Schveighoffer wrote:

[...]

But you aren't perfect, and so maybe you make a mistake, and trigger an Error. The compiler handles this unexpected condition by unwinding the stack back to the main function, printing the error and exiting, so you can go fix whatever mistake you made.

For this purpose nobody needs a separate subclass named `Error`. That works with `Exception`s.

You can use Exceptions instead. But the difference is they are part of the program instead of considered a check on the program itself.

There's a need for both.


[...]

If the code threw an `Exception` instead of an `Error` everything would be fine.

I think the point of Errors is that you can remove them for efficiency.

elephant/room.

Why? If you have a correct program, you shouldn't ever have errors thrown. If you do have errors thrown that's something you need to address ASAP.


In other words, just like asserts or bounds checks, they are not expected to be part of the normal working program.

"removing [Errors, asserts, bounds checks] is a bit like wearing a life-jacket to practice in the harbour, but then leaving the life-jackets behind when your ship leaves for open ocean" [1]

It's more like leaving the floaties behind when you are doing a swim meet.


[...]
Consider the normal flow of a range in a foreach loop, it's:

```d
// foreach(elem; range)
for(auto r = range; !r.empty; r.popFront) {
    auto elem = r.front;
}
```

If both `popFront` and `front` also always call `empty` you are calling `empty` 3 times per loop, with an identical value for the 2nd and 3rd calls.

Solution: Implement explicitly unchecked popFront() and front() versions.

That's terrible. Now I have to instrument my code whenever I have a weird unknown error, changing all range functions to use the `checkedPopFront` and `checkedFront`, just to find the error. Instead of letting the asserts do their job.


Having the assert allows diagnosing invalid programs without crashing your program,

That depends on the understanding of "crashing a program". If library code throws an `Error` instead of an `Exception` I have to isolate that code in a subprocess in order to make my program gracefully handle the error condition.

You don't gracefully handle the error condition. It's like saying gracefully handling running into the guardrail on a road. You just crash, and hope you don't die. You don't just graze into it and keep going thinking "well, the guardrail did it's job, glad it's there, I plan on using it every time I go around that corner."


Think of CGI processes which provide output direct to a customer. If there is an assert the customer will see the famous Internal Server Error message (in case of apache httpd).

An assert triggering means, your code did something invalid. It should crash/exit.

Now we can have *totally separate* debates on what should be an Error and what should be an Exception. And not to belittle your point, I understand that there can be a philosophy that you *only* want recoverable throwables for certain code domains (I myself also have that feeling for e.g. out of bounds errors). It's just not what D picked as an error handling scheme. We have both recoverable exceptions, and non recoverable errors.

-Steve

Reply via email to