On 2/10/2014 10:57 PM, Adam D. Ruppe wrote:
On Tuesday, 11 February 2014 at 03:53:05 UTC, Nick Sabalausky wrote:
I don't suppose there's a way to change the default exception handler
without using a modified druntime

I'm pretty sure there used to be, but not anymore looking at the source.
The d_run_main function has a hardcoded catch block.

Why do you need to change the default though? Can't you just wrap your
own main function in a big try/catch block?

I don't strictly *need* to. But if you're curious, here's the story:

I like to use a little custom exception (Fail) in shell script-like stuff to bail out and exit with a given error message in an exception-safe way. This is for expected failure conditions, not internal errors (so for example: "copy src.txt" -> "Error, no destination given!" or "File src.txt doesn't exist!", etc), so the stack trace is unnecessary noise and omitted. Only the message is printed, maybe with a common prefix like "mytool: ERROR: ...".

This is arguably a slight abuse of the exception system, but in script-like stuff the exception performance doesn't really matter, and I find it does greatly simply the error logic of D-based scripts. Helps keep simple scripts simple.

I'm sticking this Fail stuff into a little utility lib for simple script-like programs, and so, if possible, I'd *like* to instruct users to just do this:

void main() {
    installFailHandler();
    ...
}

instead of all this boilerplate:

int main() {
    try {
        ...user code...
    }
    catch(Fail e) {
        writeln(e.msg);
        return 1;
    }

    return 0;
}

I'm sure I could also do something like this, but it's rather ugly:

int main() {
    mixin(handleFail!(() => {
        ...user code...
    }));
}

So not a real big deal, but it'd be nice if I could swing it.

Reply via email to