Установка причины исключения в java

Я вижу, как вы поймать исключение, которое я могу напечатать e.getCause(), хотя он всегда null.

Мне нужно установить его где-нибудь, или что-то не хватает, которое задает причину null?

Ответ 1

Исключение имеет атрибуты message и cause. Сообщение - это описание, рассказывающее читателю более или менее точно, что пошло не так. cause - это нечто другое: оно есть, если доступно, другое (вложенное) Throwable.

Эта концепция часто используется, если мы используем собственные исключения:

catch(IOException e) {
  throw new ApplicationException("Failed on reading file soandso", e);
  //                              ^ Message                        ^ Cause
}

Изменить - в ответ на комментарий @djangofans.

Стандарт заключается в том, что вложенное выражение (причина) печатается с его трассировкой стека.

Запуск этого небольшого приложения

public class Exceptions {
    public static void main(String[] args) {
        Exception r = new RuntimeException("Some message");
        throw new RuntimeException("Some other message", r);
    }
}

выводит

Exception in thread "main" java.lang.RuntimeException: Some other message
    at Exceptions.main(Exceptions.java:4)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Caused by: java.lang.RuntimeException: Some message
    at Exceptions.main(Exceptions.java:3)
    ... 5 more

Оба сообщения включены.

Ответ 3

class Exception имеет конструкторы, которые принимают a cause Throwable. Вы должны вызвать эти конструкторы или предоставить конструкторам своим настраиваемым классам исключения, которые вызывают эти суперструкторы.

Ответ 4

getCause. Возвращает причину этого throwable или null, если причина несуществующей или неизвестной. (Причина - это бросок, который заставил это бросать бросить.)

Прочитайте документ Java: getCause