3 часа решал, делал конструкторы, внутри классов обёртки и т.д. Отрезюмирую всё, что хочет валидатор в пунктах по выводу ошибок. Рецепт: 0) Ловим не только RuntimeException исключения, а все исключения Throwable. 1) Сначала пробрасываем исключение: throw FirstException, throw SecondException, throw RuntimeException. 2) Надо разобраться как работает initCause() - . Пример: RuntimeException ex = new RuntimeException(); ex.initCase(e); throw ex; Это можно сделать в конструкторе; 3) Далее в методе, где getFormattedStringForFirstThread и ему подобных нужно вызывать методы переданного ex. - Ничего добавлять: новые двоеточия и пробелы, обрабатывать как-то строку - не надо. Получится: String.format(string, e.getCause(), //Я использовал e.getMessage - получал null e.getClass().getSimpleName(), //Я использовал e.getClass().toString; e.toString - возможно валя их примет или нет, я запарывался в основном на e.getMessage и на том, что использовал вместо initCase недообёртку в новых классах исключениях t.getName()); } Пример вывода: { 1# : StringForFirstThreadTooShortException : java.lang.StringIndexOutOfBoundsException: begin 0, end -1, length 1 RuntimeException : java.lang.StringIndexOutOfBoundsException: begin 0, end -1, length 0 : 3# java.lang.StringIndexOutOfBoundsException: begin 0, end -1, length 1 : StringForSecondThreadTooShortException : 2# } Итог: сказывается недостаток литературы, надо бы заставить себя читать. Удачи вам