Можем ли мы использовать композицию для пользовательского исключения в Java - PullRequest
0 голосов
/ 09 июля 2020

Мы очень стараемся не использовать проект extends (IS-A Inheritance). Но как насчет настраиваемых исключений, когда люди обычно расширяются из существующих классов исключений. Какое здесь может быть правильное решение?

class CustomException{

private Exception exception;
....

}

Ответы [ 2 ]

2 голосов
/ 09 июля 2020

Обойти это невозможно. Исключение должно быть подклассом Throwable - как указано в Java Спецификация языка 11.1.1 :

Исключение представлено экземпляром класса Throwable ( прямой подкласс Object) или один из его подклассов.

Пользовательские исключения, которые вы создаете, должны быть подклассами Exception или RuntimeException (которые являются подклассами Throwable).

2 голосов
/ 09 июля 2020

Классы исключений должны расширять класс Throwable (Exception extends Throwable). То, что вы пытаетесь достичь, невозможно в Java.

То, что вы все еще можете сделать, это что-то вроде:

class CustomException extends Exception {

private Throwable cause;
//...

}

Это фактически сделано в стандартном Java для хранения исключение, которое было root этого исключения. И обычно вы бы сделали:

try {
 // ...
} catch(AnotherException e) {
 //...
 throw new CustomException(e);
}

Почему это так спроектировано?

Ну, есть набор стандартных функций, которые все исключения должны иметь в java, вы можете увидеть в Throwable:

  • укажите причину
  • предоставьте сообщение об ошибке
  • трассировку стека в коде, где возникло исключение.

It можно было бы сделать через интерфейсы, это правда, но JRE использует класс.

...