(no title)
photon_garden | 6 months ago
But in languages with exceptions, if you want to know how a function can fail, you have two options:
- Hope the documentation is correct (it isn’t)
- Read the body of the function and every function it calls
Reasonable people can disagree on the right approach here, but I know which I prefer.
jmux|6 months ago
real
compared to every exception-based language I’ve used, rust error handling is a dream. my one complaint is async, but tbh I don’t think exceptions would fare much better since things like the actor model just don’t really support error propagation in any meaningful way
vbezhenar|6 months ago
Almost every function can fail with OutOfMemoryError and you can't do anything about it.
I've accepted that everything can fail. Just write code and expect it to throw. Write programs and expect them to abort.
I don't understand this obsession with error values. I remember when C++ designers claimed, that exceptions provide faster code execution for happy path, so even for systems language they should be preferred. Go error handling is bad. Rust error handling is bad. C error handling is bad, but at least that's understandable.
frumplestlatz|6 months ago
In user-space, memory overcommit means that we will almost or literally never see an out of memory error.
In kernel space and other constrained environments, we can simply check for allocation, failure and handle it accordingly.
This is a terrible argument for treating all code as potentially failing with any possible error condition.
whatevaa|6 months ago
I'm not talking about embedded or kernels. Different stories.
malkia|6 months ago
Why? Let's say you've opened a memory mapped file, you've got pointer, and hand this pointer down to some library - "Here work there" - the library thinks - oh, it's normal memory - fine! And then - physical block error happens (whether it's Windows, OSX, Linux, etc.) - and now you have to handle this from... a rather large distance - where "error code" handling is not enough - and you have to use signal handling with SIGxxx or Windows SEH handling, or whatever the OS provides
And then you have languages like GoLang/Rust/others where this is a pain point (yes you can handle it), but how well?
If you look in ReactOS the code is full with `__try/__except` - https://github.com/search?q=repo%3Areactos%2Freactos+_SEH2_T... - because user provided memory HAVE to be checked - you don't want exception happening at the kernel reading bad user memory.
So it's all good and fine, until you have to face this problem... Or decide to not use mmap files (is this even possible?).
Okay, I know it's just a silly little thing I'm pointing here - but I don't know of any good solution off hand...
And even handling this in C/C++ with all SEH capabilities - it still sucks...
tialaramex|6 months ago
> Almost every function can fail with OutOfMemoryError and you can't do anything about it.
In fact we can - though rarely do - prove software does not have either of these mistakes. We can bound stack usage via analysis, we usually don't but it's possible.
And avoiding OOM is such a widespread concern that Rust-for-Linux deliberately makes all allocating calls explicitly fallible or offers strategies like Vec::push_within_capacity a method which, if it succeeds pushes the object into the collection, but, if it's full rather than allocate (which might fail) it gives back the object - no, you take it.
malkia|6 months ago
But the best so far method I know.
baq|6 months ago
cwillu|6 months ago
nromiun|6 months ago
zaphar|6 months ago
johannes1234321|6 months ago
But often some "expected" errors can be handled in some way better (retry, ask user, use alternate approach, ...)