The rule of thumb is that you should ask yourself: "Who should deal with the problem logically?" and stick to it.
It is important to remember that when you write a piece of code, you are actually writing a contract describing the interaction of bits and pieces of code. For example, in your case, when you create an instance of MyConstructor, why doesn't it work? What promise was made after its creation? Most importantly, who should handle this unsuccessfully?
Some examples
Say, for example, we have a class Car , and Car instances have a drive(x) method.
When you call drive(x) , Car moves x to the right.
The drive(x) action may fail, for example, if Car already on the edge of the screen or Car does not contain fuel.
We simply defined the drive as "the car moves x places to the right", which means that the car expects to be able to complete the drive and could not complete it, a logical exception. In this case, it is obvious that the one that handles the exception is the caller, not the car itself, because it does not need to know in which environment it works. Moreover, the caller should not attempt to drive a car from the edge or without fuel.
Otherwise
Let's say that in the same example, Environment is a class that contains cars, and it has a moveCars() method that moves all cars in the environment according to some internal logic. Environment used by a program that expects it to contain all the logic of movement. We use some algorithm in moveCars() , which should assure us that cars do not collide.
We may have some extreme case that we did not think about in our moveCars() method, or one that should not happen due to some assumption, but the user on Wednesday expects him to contain all the movement logic , which means when an exception occurs, it must deal with itself.
So what is the overall strategy?
You should handle exceptions based on the responsibility performed by the code component.