Страницы

Поиск по вопросам

вторник, 18 февраля 2020 г.

Полный путь к точке выброса исключения

#java #stack


Как избавиться от "... 1 more" и увидеть полный стек вызовов, приведших к выбросу
исключения, если результатом выводится только это:

// other output data
myPack.DynamicFieldsException
    at myPack.DynamicFields.setField(DynamicFields.java:69)
    at myPack.DynamicFields.main(DynamicFields.java:99)
Caused by: java.lang.NullPointerException
    at myPack.DynamicFields.setField(DynamicFields.java:70)
    ... 1 more


Просьба в ответе показать конкретный пример, т.е. 

catch (MyException e) { ??? }


Какой код следует использовать вместо "???" чтобы получить желаемый результат (полный
вывод стека) ?

Сейчас используется:

catch (MyException e) { e.printStackTrace(); }


Такой вариант:

catch (NoSuchFieldException e) {
        for (StackTraceElement l : e.getStackTrace())
            System.out.println(l);
}


не показывает причину, заранее заданную как new Exception(new Exception()); или как
new MyException().initCause(new MyException()); 
    


Ответы

Ответ 1



Этот способ вывода информации об исключении, является способом по умолчанию. Вот так это выглядит в коде if (framesInCommon != 0) s.println(prefix + "\t... " + framesInCommon + " more"); Но вы всегда можете перехватить исключение и вывести его в нужном вам формате. Метод getStackTrace вернет вам массив типа StackTraceElement. В нем вы найдете всю необходимую информацию о стеке. try { throw new Exception(new NullPointerException()); } catch (Exception ex) { Throwable cause = ex; while (cause != null) { for(StackTraceElement element: cause.getStackTrace()) { System.out.println(element.toString()); } cause = cause.getCause(); if(cause != null) { System.out.println("Caused by " + cause); } } }

Комментариев нет:

Отправить комментарий