Как добавить к исключению Java? - PullRequest
11 голосов
/ 29 марта 2011

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

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

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

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

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

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


    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 ]

27 голосов
/ 29 марта 2011

Исключения могут быть объединены в цепочку:

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 ...
4 голосов
/ 29 марта 2011

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

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

1 голос
/ 29 марта 2011

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

Exception(String message, Throwable cause)

Сообщение - это ваши "два цента", и вы включили перехваченное исключение, которое будет показано в распечатке трассировки стека

0 голосов
/ 29 марта 2011

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

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