Comparing Exceptions and Errors
kdevel
kdevel at vogtner.de
Sun Jun 5 22:09:02 UTC 2022
On Sunday, 5 June 2022 at 20:53:32 UTC, Steven Schveighoffer
wrote:
[...]
>> 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.
I have no clue what that means.
>> [...]
>>
>>>> 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.
My code does not throw `Error`s. It always throws `Exception`s.
>>> 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.
Nice new question for job interviews.
>> [...]
>>> 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,
Well, no. Just use the default. It will throw an exception if
something goes wrong. Of course, I must admid, if you want to
compete with those I-have-the-fastest-serving-http-server-guys
(N.B.: HTTP not HTTPS! Did anybody notice that?) reporting 50
Gigarequests per second (or so) then you probably have to
*measure* *the* *performance* of the range/container
implementation. But not earlier.
> changing all range functions to use the `checkedPopFront` and
> `checkedFront`, just to find the error. Instead of letting the
> asserts do their job.
It is not clear to me, what you now complain about. You first
criticized that in
```
for(auto r = range; !r.empty; r.popFront) {
auto elem = r.front;
}
```
there is triple checking that r is not empty, namely in !r.empty,
in r.front and in r.popFront. One check, !r.emtpy, will suffice.
Hence one can safely use
```
for(auto r = range; !r.empty; r.popFront_unchecked) {
auto elem = r.front_unchecked;
}
```
If you don't trust whomever you can simply keep the checked
versions. The test will then be performed thrice regardless if a
test failure will result in throwing an `Exception` or throwing
an `Error`. AFAICS.
[...]
More information about the Digitalmars-d-learn
mailing list