I agree with the OP. I think that what() should return the details of what went wrong. I realise that this means exception objects carry some weight but I do not see any alternative. I only just discovered that poco exceptions work this way. I am shocked. I know the theory about wanting to avoid heap allocation when we already know things are going wrong but maybe there is another way around this. What if the exception only stored the first 100 chars of the error? Then Poco::Exception could have a char array and avoid heap store allocation.