I understand most of these guidelines - don't make type hierarchies too deep, make exceptions [serializable], follow the naming conventions. But why is it recommended to provide the 4 common ctors? What if my third-party library throws the exception, but never throws with an inner exception? It seems to me I don't need that ctor. What if the third party library never creates or throws a custom exception with no message. Then I shouldn't need the default ctor.
Can someone explain the motivation?