Почему в языке Go нет исключений?

Почему в языке Go авторы не добавили выбрасывание исключений, как сделано в Java и PHP?

PHP на каждый запрос запускает скрипт в отдельном процессе. Пришло сто юзеров – запустилось сто скриптов.

В случае любой ошибки там удобно из глубины просто бросить исключение и сверху поймать, показав 500 Server Error. Даже можно не ловить, ведь php-fpm сам вернёт 500, если скрипт умер.

В итоге если у двух юзеров из ста вылетел непойманный эксепшен подключения к БД, убив процесс, то остальные 98 юзеров это не заметят.

А в Go вместо одноразовых индивидуальных процессов запускается один общий, принимающий запросы от всех юзеров в цикле. И этот процесс внутри может порождать дочерние рутины. И в итоге любой непойманный RuntimeException может мгновенно убить весь этот главный процесс-сервер с кучей рутин, обслуживающих тысячи клиентов.

Поэтому в асинхронных системах кидаться исключениями весьма рискованно. И там как раз отказываются от исключений в пользу возврата ошибок.

Источник

Почему не сделали как в PHP или Java, где спокойно используют исключения.

В каждом языке есть специфические нюансы и договорённости.

Например, насчёт возврата null есть разница в типизации между PHP и Java, которая влияет на использование исключений.

В PHP есть возможность через nullable-тип вроде ?User явно указать, что метод вернёт объект юзера или null. Поэтому можно спокойно возвращать null, и статические анализаторы и IDE подскажут, если мы после вызова забудем проверить результат на if (x === null). Проблем нет.

А в Java, наоборот, такого нет. Там если указан тип User туда можно всё равно вернуть или присвоить null. И анализатор и компилятор это проследить не может. В итоге если из метода с типом User вернуть null, то код выше свалится по NullPointerException.

Поэтому в Java есть общепринятая договорённость никогда не возвращать null. Вместо этого принято кидать исключения, возвращать объект Null Object или оборачивать результат или null в объект Optional.

В итоге есть Go вообще без исключений, есть Java с исключениями или NullObject без использования null и есть PHP с исключениями и спокойным использованием null.

Это пример того, как в разных языках принято делать по разным причинам.

Источник

Дмитрий Елисеев
elisdn.ru
Комментарии (4)
Евгений

Спасибо, полезная заметка

Ответить
Роман

Спасибо, а можно еще добавить дату и время размещения поста тут?

Ответить
Дмитрий Елисеев

Добавили в списке

Ответить
Роман

благодарствую!

Ответить
Зарегистрируйтесь или войдите чтобы оставить комментарий

Или войти через:

Yandex
MailRu
GitHub
Google