В книге «Функциональное программирование на Scala» есть несколько слов о проверенном исключении:
Проверенные исключения
Проверенные исключения в Java, по крайней мере, вынуждают принять решение о том, следует ли обрабатывать или повторно вызывать ошибку, но они приводят к значительному шаблону для вызывающих. Что еще более важно, они не работают для функций более высокого порядка, которые не могут знать о конкретных исключениях, которые могут быть вызваны их аргументами. Например, рассмотрим функцию map, которую мы определили для List:
def map[A,B](l: List[A])(f: A => B): List[B]
Эта функция явно полезна, очень универсальна и противоречит использованию проверенных исключений — у нас не может быть версии карты для каждого отдельного проверенного исключения, которое может быть вызвано
f
. Даже если бы мы захотели это сделать, как бы карта узнала, какие исключения возможны? Вот почему общий код, даже в Java, так часто прибегает к использованию RuntimeException или какого-либо общего проверенного типа Exception.
Я прочитал этот раздел несколько раз, но до сих пор не понимаю, почему проверяемое исключение не работает для функций более высокого порядка.
Может ли кто-нибудь привести несколько примеров, чтобы сделать это более понятным?