Я пришел на Java из C ++.
Как в Java, так и в C ++ у нас есть возможность конкретные исключения. Это выглядит так:
void function_name() throw(Exception)
{
...
if (error)
{
throw Exception("Error");
}
...
}
Как я знаю, написание спецификации исключений считается плохой практикой в C ++. В отличие от C ++, в Java мы должны это сделать. Итак, мой вопрос:
В чем преимущество написания спецификации исключений в Java?
Вы должны указать только проверенные исключения (подклассы Exception
класс) в сигнатуре метода. Непроверенные исключения (подклассы RuntimeException
класс) указывать не нужно.
Определение исключений в сигнатуре метода является неотъемлемой практикой Java, определяемой семантикой языка. Но есть также много споров об этом. Некоторые команды и проекты даже считают это плохой практикой и используют только непроверенные исключения.
Как правило, в качестве хорошей практики вы должны генерировать проверенное исключение, когда определяете его как часть контракта метода, т.е. вызывающий метод должен знать о каком-то конкретном (вполне возможном и восстанавливаемом) типе ошибки и либо перехватывать, либо обрабатывать его. или передать его в стек вызовов. Непроверенные исключения обычно указывают на некоторую внутреннюю ошибку в коде метода и, следовательно, не должны быть перехвачены.
Здесь нет прибыль в Java спецификация исключений является обязательной. Java была разработана с более сильной системой типов, чем C ++. В C ++ спецификация исключений была необязательной, и Java-дизайнеры считали, что исключение является важной частью разработки программы, поэтому они решили применять спецификацию исключений всякий раз, когда функция может их выбросить. Это иногда противоречиво, но это выбор языка дизайна. Исключение составляют часть контрактов на звонки.