@Nonnull
    public static <T extends Throwable> T cloneExceptionWithFixedAsyncStackTrace(@Nonnull T original) {
        StackTraceElement[] fixedStackTrace = getFixedStackTrace(original, Thread.currentThread().getStackTrace());

        Class<? extends Throwable> exceptionClass = original.getClass();

        Throwable clone = tryCreateExceptionWithMessageAndCause(exceptionClass,
                original.getMessage(), original.getCause());

        if (clone != null) {
            clone.setStackTrace(fixedStackTrace);
            return (T) clone;
        }

        return original;
    }
@Test
    public void testCloneExceptionWithFixedAsyncStackTrace_whenStandardConstructorSignature_thenAppendAsyncTrace() {
        IOException expectedException = new IOException();
        ExecutionException result = ExceptionUtil.cloneExceptionWithFixedAsyncStackTrace(new ExecutionException(expectedException));

        assertEquals(ExecutionException.class, result.getClass());
        assertEquals(result.getCause(), expectedException);
    }