Добавление информации в исключение - PullRequest
10 голосов
/ 31 декабря 2010

Я хотел бы добавить информацию в трассировку / исключение стека.

По сути, сейчас у меня есть что-то подобное, что мне действительно нравится:

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at com.so.main(SO.java:41)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke

Однако я бы хотел перехватить это исключение и добавить к нему дополнительную информацию, сохранив при этом исходную трассировку стека.

Например, я бы хотел, чтобы это было:

Exception in thread "main" CustomException: / by zero (you tried to divide 42 by 0)
    at com.so.main(SO.java:41)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke

Таким образом, в основном я хочу перехватить ArithmeticException и перебросить, скажем, CustomException (добавив "вы пытались разделить 42 на 0" в этом примере), сохраняя при этом трассировку стека из исходного ArithmeticException.

Как правильно сделать это в Java?

Правильно ли следующее:

try {
     ....
} catch (ArithmeticException e) {
     throw new CustomException( "You tried to divide " + x + " by " + y, e );
}

Ответы [ 2 ]

11 голосов
/ 31 декабря 2010

Вы также можете сделать это:

try {
     ....
} catch (ArithmeticException e) {
     ArithmeticException ae = new ArithmeticException( "You tried to divide " + x + " by " + y+" "+e.getMessage());
     ae.setStackTrace(e.getStackTrace());
     throw ae;
}

Что даст вам "невидимые" исключения :-)

Обновление [27 сентября 2012]:

В Java 7: еще один крутой трюк:

try {
    ...
} catch (ArithmeticException e) {
    e.addSuppressed(new ArithmeticException( "You tried to divide " + x + " by " + y));
    throw e;
}
11 голосов
/ 31 декабря 2010

Да, вы можете вкладывать исключения как в Java, так и в Java 1.4.Я делаю это все время.См. http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Throwable.html.

Когда кто-то печатает трассировку стека из вашего пользовательского исключения, он покажет как трассировку CustomException стека, так и трассировку стека вложенной ArithmeticException.Вы можете вкладывать произвольно глубоко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...