Creates a copy of the current instance.
For better debuggability, it is recommended to use original exception as cause of the resulting one. Stacktrace of copied exception will be overwritten by stacktrace recovery machinery by Throwable.setStackTrace call. An exception can opt-out of copying by returning
null from this function. Suppressed exceptions of the original exception should not be copied in order to avoid circular exceptions.
This function is allowed to create a copy with a modified message, but it should be noted that the copy can be later recovered as well and message modification code should handle this situation correctly (e.g. by also storing the original message and checking it) to produce a human-readable result.