I believe a method like `getMessageString` should be doing the real work and `__toString` would simply call it. Most implementation would use the `getMessageString` method for proper exception handling and `__toString` would be a fallback with something like return the message of the exception.