Size: a a a

2020 August 11

KN

Kirill Nesmeyanov in PHP
ну, типа, не вижу ничего зазорного в том, что попытаться отработать дефолтный код, а при исключении а кетче отправить в фоллбек
источник

k

knopkod4v in PHP
Sergey Protko
что бы обрабатывать исключительные! ситуации. Например если у тебя есть функция которая принимает на вход данные и данные могут быть невалидны, то для этой функции невалидные данные это НЕ исключительная ситуация. И лучше вернуть ошибку явно как результат работы. В тоже время функция которая не смогла законнектиться к базе будет такое воспринимать уже как исключительную ситуацию.

Ну а дальше как бы дизайн языка решает как чего удобнее или неудобнее. В Го пошли по пути максимально явной и тупой проверки на ошибку что бы уменьшить количество проблем. В Java исключения сделали частью интерфейса и тебе их надо явно обрабатывать... но оно не покрывает всех кейсов.

Основной довод ЗА исключения - что это удобно. Кинул ошибку, и синтаксис языка обычно тебе позволяет это дело различать

try {
   $result = fn();
} catch (Throwable) {
   // не удалось
}


в чем-то это похоже на варианты в том же го, только там тебе надо руками по стэктрейсу прокидывать ошибку.

[$result, $error] = fn();
if ($error) {
   return [null, $error]
}


Кто-то называет существенным плюсом тут то, что люди начинают думать о глубине стэк трейса или более явно конвертировать ошибки... Но никто не спорт что лень такое писать везде. Хочется сахарку. Потому можно видеть пропозалы в стиле:

val result, ^ = fn()


которое автоматом отправит ошибку выше по трейсу.

В целом же основная проблема исключений - когда их используют как goto. мол

try {
  $this->tryThis();
} catch (YouShouldDoThisInstead $e) {
 $this->doThis();
} catch (OrYouShouldDoThat $e) {
  $this->doThat();
}


то есть грубо говоря у нас тут уже на исключениях выстраивается логика.
лучше скажи как у вас принято - ошибки или эксепшены?)
источник

SP

Sergey Protko in PHP
knopkod4v
лучше скажи как у вас принято - ошибки или эксепшены?)
исключения канешна
источник

MM

Maksim Masiukevich in PHP
knopkod4v
лучше скажи как у вас принято - ошибки или эксепшены?)
коварный ты)
источник

АС

Альберт Степанцев... in PHP
Алексей Гевондян
ну пусть будет getValue(): int, кидающий исключение в случае отсутствия валидного значения. тоже годно.
супер
осталось доумиться кидать исключение не в getValue()
а прямо в конструкторе
чтобы не допустить сам факт существования невалидного объекта
потому что он не нужен
источник

AC

A C in PHP
Алексей Гевондян
ну пусть будет getValue(): int, кидающий исключение в случае отсутствия валидного значения. тоже годно.
чёт звучит стрёмно
источник

k

knopkod4v in PHP
Maksim Masiukevich
коварный ты)
ну да, одно дело с дивана рассуждать, а другое в пыхопе ковыряться)
тут удобно на диване, попкорн и вот это всё ^__^
источник

АГ

Алексей Гевондян... in PHP
Sergey Protko
что бы обрабатывать исключительные! ситуации. Например если у тебя есть функция которая принимает на вход данные и данные могут быть невалидны, то для этой функции невалидные данные это НЕ исключительная ситуация. И лучше вернуть ошибку явно как результат работы. В тоже время функция которая не смогла законнектиться к базе будет такое воспринимать уже как исключительную ситуацию.

Ну а дальше как бы дизайн языка решает как чего удобнее или неудобнее. В Го пошли по пути максимально явной и тупой проверки на ошибку что бы уменьшить количество проблем. В Java исключения сделали частью интерфейса и тебе их надо явно обрабатывать... но оно не покрывает всех кейсов.

Основной довод ЗА исключения - что это удобно. Кинул ошибку, и синтаксис языка обычно тебе позволяет это дело различать

try {
   $result = fn();
} catch (Throwable) {
   // не удалось
}


в чем-то это похоже на варианты в том же го, только там тебе надо руками по стэктрейсу прокидывать ошибку.

[$result, $error] = fn();
if ($error) {
   return [null, $error]
}


Кто-то называет существенным плюсом тут то, что люди начинают думать о глубине стэк трейса или более явно конвертировать ошибки... Но никто не спорт что лень такое писать везде. Хочется сахарку. Потому можно видеть пропозалы в стиле:

val result, ^ = fn()


которое автоматом отправит ошибку выше по трейсу.

В целом же основная проблема исключений - когда их используют как goto. мол

try {
  $this->tryThis();
} catch (YouShouldDoThisInstead $e) {
 $this->doThis();
} catch (OrYouShouldDoThat $e) {
  $this->doThat();
}


то есть грубо говоря у нас тут уже на исключениях выстраивается логика.
есть люди, которые данные наверх пробрасывают исключениями) конечно язык позволяет много чего нахреновертить
источник

AC

A C in PHP
ну применение выглядит ржачным, я бы не додумался, честно)
источник

АГ

Алексей Гевондян... in PHP
Альберт Степанцев
супер
осталось доумиться кидать исключение не в getValue()
а прямо в конструкторе
чтобы не допустить сам факт существования невалидного объекта
потому что он не нужен
мы же тут про валидацию грим
источник

MM

Maksim Masiukevich in PHP
A C
ну применение выглядит ржачным, я бы не додумался, честно)
слабак) я так полтора года делал :)
источник

SP

Sergey Protko in PHP
Kirill Nesmeyanov
ну, типа, не вижу ничего зазорного в том, что попытаться отработать дефолтный код, а при исключении а кетче отправить в фоллбек
не, проблема когда именно та штука которая кидаеи исключение вкурсе что там сверху кто-то есть и дернет фэлбэк. Это оч тонкая грань.

Мол если у тебя штука не смогла законнектиться к рэдису и мы фолбэчимся на какой другой стор для кэша - такая логика ок потому как клиент к рэдису ни сном не духом о том что надо что-то делать дальше.

А я вот про такие штуки:

function whatShouldGoNext() {
   if($this->firstThingCompleted) {
       throw new GoToSecondStep();
   }
   throw new GoToFirstStep();
}
источник

АС

Альберт Степанцев... in PHP
Алексей Гевондян
мы же тут про валидацию грим
повторю вопрос - у вас фобия?
источник

AC

A C in PHP
Maksim Masiukevich
слабак) я так полтора года делал :)
не, ну эти извращения давай без меня :D
источник

KN

Kirill Nesmeyanov in PHP
Sergey Protko
не, проблема когда именно та штука которая кидаеи исключение вкурсе что там сверху кто-то есть и дернет фэлбэк. Это оч тонкая грань.

Мол если у тебя штука не смогла законнектиться к рэдису и мы фолбэчимся на какой другой стор для кэша - такая логика ок потому как клиент к рэдису ни сном не духом о том что надо что-то делать дальше.

А я вот про такие штуки:

function whatShouldGoNext() {
   if($this->firstThingCompleted) {
       throw new GoToSecondStep();
   }
   throw new GoToFirstStep();
}
имхо, вообще грани нет
источник

SP

Sergey Protko in PHP
Sergey Protko
не, проблема когда именно та штука которая кидаеи исключение вкурсе что там сверху кто-то есть и дернет фэлбэк. Это оч тонкая грань.

Мол если у тебя штука не смогла законнектиться к рэдису и мы фолбэчимся на какой другой стор для кэша - такая логика ок потому как клиент к рэдису ни сном не духом о том что надо что-то делать дальше.

А я вот про такие штуки:

function whatShouldGoNext() {
   if($this->firstThingCompleted) {
       throw new GoToSecondStep();
   }
   throw new GoToFirstStep();
}
валидация входящих данных (именно то что юзер в формочку написал а не параметры функций) это отличный пример - мы когда ошибку кидаем в этом случае мы тип направляем контрол флоу.
источник

АГ

Алексей Гевондян... in PHP
Альберт Степанцев
повторю вопрос - у вас фобия?
нет)
источник

АС

Альберт Степанцев... in PHP
тогда что вас смущает?
источник

SP

Sergey Protko in PHP
Kirill Nesmeyanov
имхо, вообще грани нет
"что ты за деревенщина, новый меллениум! Границ больше нет!"
источник

KN

Kirill Nesmeyanov in PHP
потому что что ты пишешь invalid argument exception какой-нибудь, что ловишь его - с другой стороны может выглядеть как "так специально"
источник