Как добавить исключение Java?

Я новичок в Java и исключениях в целом.

в мои предыдущие дни программирования C/Perl, когда я писал библиотечную функцию, ошибки передавались булевым флагом плюс какая-то строка с удобным для человека (или программиста) сообщением об ошибке. Java и C++ имеют исключения, что удобно, поскольку они включают трассировки стека.

Я часто нахожу, когда я ловлю исключение, я хочу добавить свои два цента,а затем передать его.

Как это можно сделать? Я не хочу выбрасывать весь след стека... Я не знаю, насколько глубоко произошел сбой и по какой причине.

У меня есть небольшая библиотека утилит для преобразования трека стека (из объекта исключения) в строку. Думаю, я мог бы добавить это к моему новому сообщению об исключении, но это похоже на взлом.

Ниже приведен пример метода. Советы?


    public void foo(String[] input_array) {
        for (int i = 0; i < input_array.length; ++i) {
            String input = input_array[i];
            try {
                bar(input);
            }
            catch (Exception e) {
                throw new Exception("Failed to process input [" 
                        + ((null == input) ? "null" : input)
                        + "] at index " + i + ": " + Arrays.toString(input_array) 
                        + "n" + e);
            }
        }
    }

4 ответов


исключения могут быть соединены:

try {
    ...
} catch (Exception ex) {
    throw new Exception("Something bad happened", ex);
}

это делает оригинальное исключение причина новой. Причину исключения можно получить с помощью getCause(), а вызов printStackTrace() на новом исключении будет напечатано:

Something bad happened
... its stacktrace ...
Caused by:
... original exception, its stacktrace and causes ...

обычно вы бросаете новое исключение, которое включает старый исключение как "причина". Большинство классов исключений имеют конструктор, который принимает исключение" причина". (Вы можете получить это через Throwable.getCause().)

обратите внимание, что вы почти никогда не должны ловить просто Exception - как правило, вы должны улавливать более конкретный тип исключения.


просто используйте другой конструктор:

Exception(String message, Throwable cause)

сообщение является вашим "два цента", и вы включаете пойманное исключение, которое будет показано в распечатке stacktrace


вы можете добавить основную причину во вновь созданное исключение:

    throw new Exception("Failed to process input [" 
                + ((null == input) ? "null" : input)
                + "] at index " + i + ": " + Arrays.toString(input_array) 
                + "\n" + e.getMessage(), e);