Когда следует переносить исключения времени выполнения / непроверенные исключения - например, CompletionException

Когда следует переносить исключения времени выполнения / непроверенные исключения? В чем необходимость? Почему был введен CompletionException в java8? В java есть и другие примеры, и, пожалуйста, включите столько примеров, сколько хотите.


person singhsumit    schedule 10.09.2015    source источник
comment
всякий раз, когда вы голосуете за закрытие, пожалуйста, прокомментируйте свою причину. Это может помочь в качестве обратной связи.   -  person singhsumit    schedule 10.09.2015
comment
Вы этого не сделаете. CompletableFuture делает.   -  person Holger    schedule 10.09.2015
comment
@ Вопрос Холджера не в том, кто это делает, а в том, почему? В чем необходимость?   -  person singhsumit    schedule 11.09.2015
comment
@JarrodRoberson: вопрос, который я хочу задать, и который вы пытаетесь связать, очень разные. Вопрос, помеченный как повторяющийся, мне тоже неактуален.   -  person singhsumit    schedule 11.09.2015
comment
@Holger, поэтому я вижу, что если есть какое-то исключение времени выполнения при выполнении кода thenAccept или whenComplete, то мы хотим различать его с исключением времени выполнения, созданным самим future. Для этого он заключен в CompletionException. это? это кажется очень слабой мотивацией, поэтому я наверняка что-то упускаю   -  person singhsumit    schedule 11.09.2015
comment
Это мотивация ExecutionException, ExceptionInInitializerError, _ 3_, _ 4_ и многие другие. Как правило, это мотивация для создания разных типов исключений.   -  person Holger    schedule 11.09.2015
comment
да, я пытался упомянуть исключение выполнения, когда писал вопрос, но он ускользнул из моей головы, и я не мог вспомнить ... причина, по которой я считаю его слабым, заключается в том, как если бы я получил NPE (нулевой указатель), а затем само по себе красивое исключение, зачем его заворачивать ..   -  person singhsumit    schedule 11.09.2015
comment
в любом случае большое спасибо за ваше время, и если вы чувствуете, что есть больше объяснений или какой-то другой аспект, пожалуйста, дайте мне знать   -  person singhsumit    schedule 11.09.2015


Ответы (1)


Я оборачиваю проверенные исключения всякий раз, когда представляю интерфейс. Например, если бы у меня был интерфейс

public interface DoSomething { void doSomething() throws DoSomethingException }

С моим собственным проверенным классом исключений DoSomethingException. Это потому, что я заключаю договор с клиентами интерфейса, что будет выброшено только это исключение. Это отделяет клиентов от исключений, создаваемых реализациями DoSomething. Независимо от того, поймаю ли я RuntimeExceptions и закрою проверенное исключение, я подхожу к каждому конкретному случаю. Например, если реализация DoSomething использует класс, который достаточно часто бросает RuntimeException, я бы поймал RuntimeException и заключил бы их в свое проверенное исключение.

java.util.concurrent.CompletionException, представленный в Java 8, является частью параллельного пакета, что указывает на то, что он используется для новых параллельных инструментов, представленных в Java 8. Например, https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletionStage.html

person Samuel    schedule 10.09.2015
comment
спасибо за Ваш ответ. Я понимаю необходимость упаковки в случае отмеченного исключения, и мой вопрос касается непроверенного исключения. Другой вопрос, который я попросил задать то же самое, заключается в том, почему в java8 был введен класс завершенияException? - person singhsumit; 10.09.2015