Question

Is it possible to handle exceptions in these scenarios:

  1. thrown from constructor before entering main()
  2. thrown from destructor after leaving main()
Was it helpful?

Solution

  1. You can wrap up your constructor withing a try-catch inside of it.
  2. No, you should never allow exception throwing in a destructor.

The funny less-known feature of how to embed try-catch in a constructor:

object::object( int param )
try
  : optional( initialization )
{
   // ...
}
catch(...)
{
   // ...
}

Yes, this is valid C++. The added benefit here is the fact that the try will catch exceptions thrown by the constructors of the data members of the class, even if they're not mentioned in the ctor initializer or there is no ctor initializer:

struct Throws {
  int answer;
  Throws() : answer(((throw std::runtime_error("whoosh!")), 42)) {}
};

struct Contains {
  Throws baseball;
  Contains() try {} catch (std::exception& e) { std::cerr << e.what() << '\n'; }
};

OTHER TIPS

Yes: don't use dangerous global objects!

It might be possible to set an exception handler before construction / destruction of the objects in question, that one should be able to handle those exceptions.

For constructors, there's some weird new syntax that allows exceptions to be caught within the constructor. Not sure how that works, and it's not commonly implemented in many compilers.

For destructors, you have to wrap the content of the destructor in a try { code(); } catch(...) {} block. Which may not always be the desired behavior, depending on what you want to achieve in that destructor.

Short answer: no.

Any global object that throws an exception in its constructor will cause an unhandled exception (that is, terminate be called).

Any class that throws an exception in its destructor is a broken class.

Using the singleton pattern rather than globals will give you more options.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top