4 ms·
Often you need to return error objects. Consider a function for parsing something. You want to return not only the error code, but also the line and column numb
by bjourne 7y ago
Often you need to return error objects. Consider a function for parsing something. You want to return not only the error code, but also the line and column number of the parse error, and a description of it. So you need two output parameters; one for the result and one for the error. Your declaration becomes something like this:
bool parse(inp_type *a, out_type **b, out_error **c);
where the return value false indicates an error. In C++, you'd just have written something like:
out_type parse(const inp_type& a);
and thrown an exception on error.
- Crinus 7y agoIn C you can return a struct, however a better approach is to use a context object which also contains error information, like: ctx_t* ctx = ctx_new(); if (!ctx) ... fail ... if (!ctx_parse(ctx, code)) { show_error_message(ctx_erline(ctx), ctx_ercol(ctx)); ... more fail ... ctx_free(ctx); /* often done in a goto'd section to avoid missing frees*/ } This also allows you to extend the APIs functionality, error information, etc in the future while remaining backwards compatible.
- alyandon 7y agoThat is very similar to the way I handled errors back in my C days.
- bjourne 7y agoYep, you're absolutely right. But don't tell me that is simple! :)
- machinecoffee 7y agoWhich is great, except that ctx_new() requires a malloc, which then can fail, and now you can't even explain why the thing failed, as you have no context info. You also have to worry about all of the ctx objects you've created along the way, to free them up as you recover from the low memory error.