Defering is good, but I would derive Exception from runtime_error, which needs
a std::string in constructor, so the conversion need to be done in the
constructor.
Another possible solution is to use runtime_error, give the constructor a
empty string and override what().
I'd suggest doing in the constructor at least for now. I might be able to tweak it when doing the Unicode rework if it appears to be a significant performance issue.
