@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_whenNonStandardConstructor_then_cloneReflectively() {
        IOException expectedException = new IOException();
        Throwable result = ExceptionUtil.cloneExceptionWithFixedAsyncStackTrace(
                new NonStandardException(1337, expectedException));

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