meeting log January 30, 2001
linas@linas.org
linas@linas.org
Wed, 31 Jan 2001 22:57:06 -0600 (CST)
I have not read the whole of this log yet. But the following caught my
eye, and I have to address dres' reservations:
An error stack is about as close as you can come to having exceptions in
C. Here's how it works. (This example uses macros, please pardon the
sin)
typedef enum { BadDog=23, ...} ErrType;
ErrType pop_error(void);
void push_error(ErrType);
void some_low_func (..)
{
if(something bad) { THROW (BadDog); }
}
void some_user_func(..)
{
TRY {
some_low_func();
}
CATCH {
case BadDog:
printf ("Bad Dog! Sit in the corner!!!\n");
break;
}
}
and the 'magic macros' that make this work:
#define THROW(ERR) { push_error(ERR); return; }
#define TRY /* no-op */
#define CATCH {ErrType e; while (e=pop_error()) { switch (e) {
I've got some parens matching problems here, and its a little
oversimplified, but its hopefully obvious now that C++/Java exceptions
are nothing more than an error stack with some syntatic sugar.
So dres: you said you wished for C exceptions?
--linas
> 16:19:14 <rlb> Linas has nearly convinced me that error stacks and error retrieval/pop func == good (as long as you're guaranteed to have thread-specific variables if/when you ever need to work right in a threaded envt).
> 16:19:39 <rlb> Anything else interesting up?
> 16:20:03 <dave_p> nothing from me
> 16:20:20 * dres wishes C had exceptions then we could do good error handling.
> 16:20:48 <rlb> dres: true, though the stack approach gets you much of what you need.
> 16:20:55 <dres> i don't like an error stack on principle, but i can see it being the best solution available.
> 16:21:17 <rlb> dres: as long as you have the thread-specific vars available for later, it's OK, I think.
> 16:21:24 <rlb> (as a general API).
> 16:22:04 <dres> it's not functional. it still requires you to return at least a true/false condition from all functions.
> 16:22:04 <rlb> dres: also it's potentially the most efficient option. opengl uses it for exactly that reason. You can try to draw a million polygons in a tight loop and then ask if anything went wrong at the end.
> 16:22:18 <dres> it separates the error from the occurence in unpredictable ways
> 16:22:25 <rlb> dres: keeps argument signatures smaller for those tight loops.