Skip to content
Advertisement

An implicit try {} catch around main

In each of my main functions, I would like to catch certain classes of exceptions and convert them to exit codes.

Is there a more elegant solution to this than starting and ending each main function with macros that will paste the implicit try {} catch I want?

Can I somehow achieve this with the std::set_terminate functionality?

Example:

int main(){
    try { //<- insert this

    /*
    the business logic goes here
    */

    //-> and insert this
    }
    catch(const Someclass1& e){ return 2; }
    catch(const Someclass2& e){ return 3; }
    //...
    catch(...){ return 1; } 
}

Advertisement

Answer

A clean way involves using a translation function with all of your exception boilerplate that returns the exit values for the corresponding exception.

template <typename Callable>
int call_and_translate_for_boundary(Callable&& func)
try {
    func();
    return 0;
}
catch(const Someclass1& e){ return 2; }
catch(const Someclass2& e){ return 3; }
//...
catch(...){ return 1; } 

In your own code, you only concern yourself with wrapping your business logic with a lambda and passed that into the translation function so it can capture and translate for you.

int main() {
    return call_and_translate_for_boundary([&]{
        //business logic here
    });
}
User contributions licensed under: CC BY-SA
7 People found this is helpful
Advertisement