Сохранен 28
https://2ch.hk/pr/res/544930.html
Прошлые домены не функционирует! Используйте адрес ARHIVACH.VC.
24 декабря 2023 г. Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!

Исключения

 Аноним 18/09/15 Птн 09:41:29 #1 №544930 
14425584900200.jpg
Мне не нравятся обычные исключения, из-за них поток управления становится трудноотслеживаемым, изучать код с ними бывает сложно.
Мне не нравятся checked exceptions, они не спасают от недостатков обычных, но при этом вынуждают писать лишние аннотации.
Мне не нравится c/go-подобный подход, он вынуждает повторять однотипные блоки возврата, а затем вынуждает высматривать их в теле процедуры. Вообще, ранний возврат мне кажется неудобным для чтения.
Мне не нравится haskell-подобный подход, он по сути является вариантом checked exceptions, только вместо throws пишем Either и прописываем возврат исключения явным образом.

В каком языке, по-вашему, исключения работают идеально?
sageАноним 18/09/15 Птн 11:24:48 #2 №544954 
>>544930 (OP)
Сигнальный протокол в common lisp'е
Аноним 18/09/15 Птн 11:49:24 #3 №544961 
14425661647820.jpg
>>544954
Ты охуенен. И эти сигналы на первый взгляд охуенны. Но сейчас я найду причины, по которым они плохи.
Для упрощения этой задачи, можешь привести пример перехвата ошибки с последующим восстановлением.
Аноним 18/09/15 Птн 11:53:33 #4 №544965 
>>544930 (OP)
Нет ничего идеального, иначе не было бы 100500 разных парадигм и языков. Для процедурного программирования unchecked exceptions кагбе наименее плохой вариант.
Аноним 18/09/15 Птн 12:50:17 #5 №544994 
>>544961
http://ideone.com/djTBth
То же, но не с вырвиглазной разметкой: http://paste.lisp.org/display/155379
Там два перезапуска используются: если значение - неведомая поебень, то skip-this-shit, если число, то store-value
Аноним 18/09/15 Птн 13:34:11 #6 №545032 
>>544965
>>544965
Все говен и создавались большинство на коленке для поднятия ЧСВ.
Идеального тоже нет. НО программирование это инженерная дисциплина и в ней должен быть порядок.
А порядка нет. Есть куча петухов которые тянут одеяло на себя и обмазываются всякими фичами, которым цена три копейки.
Каждый мнит себя творцом, клепает по 10 языков за год и тянет ИТ в энтропию.
Аноним 18/09/15 Птн 18:19:07 #7 №545290 
Either вместе с do-сахарком охуенна.
А ты хуесос.
Аноним 18/09/15 Птн 20:00:54 #8 №545322 
>>545290
>Either вместе с do-сахарком охуенна.
Конечно охуенна. Просто без ду-сахарка еитхер - неюзабельное говно, а с ним - те же исключения, что и в яве.
Аноним 18/09/15 Птн 22:32:41 #9 №545428 
>>545322
>>545290
>Either вместе с do-сахарком охуенна.
>Просто без ду-сахарка еитхер - неюзабельное говно
Э, уася, но как же монадка, either то композабелен. А твои сраные сигналы и эксепшны нет.
Аноним 18/09/15 Птн 22:47:10 #10 №545434 
>>544930 (OP)
let it crash
/thread
Аноним 18/09/15 Птн 22:52:38 #11 №545438 
Всегда нравилась эта аргументация. Ну так-то фича не плохая, но вот если убрать вон ту штуку, получится говно. Перекатывайтесь лучше в java/scala/rust/etc
Илюша !NPmTm9ltvI 18/09/15 Птн 22:53:31 #12 №545439 
Go!
sageАноним 18/09/15 Птн 22:56:33 #13 №545441 
>>545439
съеби обратно в свой петушиный куток и гоуно своё примитивное забери
Аноним 18/09/15 Птн 22:59:26 #14 №545442 
>>545428
> either то композабелен
Что ты подразумеваешь под "композабелен"?
(<=<) шоле? Так тут никаких отличий от исключений.
Аноним 19/09/15 Суб 00:03:48 #15 №545465 
>>545442
В случае Either ошибка является полноценным значением, а не костылём, прикрученным сбоку. И, соответственно, функции, которые могут принимать/возвращать ошибку можно комбинировать так же, как и обычные функции.
Аноним 19/09/15 Суб 00:13:59 #16 №545469 
>>545465
ВНЕАПНО исключения - такие же обычные первоклассные объекты, которые можно так же передать в другую функцию, вернуть как значение или опять как исключение.
Никаких принципиальных отличий.
Аноним 19/09/15 Суб 00:27:32 #17 №545472 
>>545469
Но для этого нужно лепить
{ try { foo(); } catch (Exception e) { bar(); } baz(); }
вместо какого-нибудь
foo >>= bar >== baz
мимо
Аноним 19/09/15 Суб 00:33:47 #18 №545473 
14426120273970.png
>>545465
>а не костылём, прикрученным сбоку
Таким некостылём, что в хаскеле до сих пор бардак с обработкой ошибок.
>>545472
И что за хуйню ты написал?
Аноним 19/09/15 Суб 00:36:24 #19 №545474 
14426121846030.png
>>545473
Ах, обосрался со стрелочкой. Но суть от этого не меняется.
Аноним 19/09/15 Суб 11:21:06 #20 №545611 
>>545473
> хаскеле до сих пор бардак
Точка. Это одна из ключевых особенностей хаскеля, к примеру, в скале с этим получше.
Аноним 25/09/15 Птн 11:07:54 #21 №548813 
>>544994
>(restart-case (factorial x) (skip-this-shit (&optional y) y))
Выглядит идентично try { return factorial(x); } catch(SkipThisShitException e) { return e; }
А invoke-restart выглядит идентично throw. В чем профит?
Аноним 25/09/15 Птн 14:27:15 #22 №548874 
>>548813
Ты не понял. Ошибка type-error отлавливается тут:[code lang=lisp]
(handler-bind ((type-error #'fix-input))
(print (factorials 1 5.2 2 3 "sasai" -1 5 6)))
[/code]
И обрабатывается функцией fix-input [code lang=lisp]
(defun fix-input (cond)
(typecase #1=(type-error-datum cond)
((integer 0) (store-value (abs #1#)))
(real (store-value (floor #1#)))
(t (invoke-restart 'skip-this-shit :skipped))))[/code], которая принимает решение о дальнейших действиях: заменить аргумент n в factorial, вызвав перезапуск store-value, или пропустить вычисления и вернуть :skipped

>А invoke-restart выглядит идентично throw.
invoke-restart вызывается
выше* по стеку вызовов, throw - ниже.
Аноним 25/09/15 Птн 14:46:36 #23 №548885 
>>548874
>invoke-restart вызывается выше* по стеку вызовов, throw - ниже.
Эт я хуйню написал. Фактически invoke-restart тоже ниже, но фишка в том, что при обработке сигнала (type-error в нашем случае) стек вызовов не раскручивается, и обработчик вызывается в том же месте (в функции factorial, в недрах check-type) и с тем же динамическим окружением, где сигнал произошел, поэтому принимать решение о перезапусках можно выше.

В общем, try catch'ами такое сэмулировать не получится.
Аноним 25/09/15 Птн 15:25:42 #24 №548900 
>>545472
Ох уж эти функцианальщики. Как только выберутся за пределы своей функцианальной песочницы, так сразу беспомощные. Все мозги отсыхают, видимо. Дали тебе фвп - делай конбенаторы и канбенируй.
http://try.haxe.org/#91955
Аноним 25/09/15 Птн 15:57:34 #25 №548922 
>>548900
>conbenator
Это ж просто не полиморфная версия (return .)
Аноним 25/09/15 Птн 15:59:16 #26 №548923 
Можно оборачивать try-except в Maybe, например:

[code]
def maybe_int(x):
try:
return Just(int(x))
except:
return Nothing

value = (
maybe_int(input())
.bind(lambda x: maybe_int(input())
.bind(lambda y: Just(x + y)))
)
[/code]

А так можно упростить себе жизнь:
[code]
def wrap_try(fn):
def inner(args):
try:
return Just(fn(
args))
except:
return Nothing

maybe_int = wrap_try(int)
[/code]
[/code]
Аноним 25/09/15 Птн 16:01:31 #27 №548925 
>>548923
мда, форматирование съехало, и return inner забыл
но думаю, суть ясна
и да, если кому не понятно — это пытон
Аноним 25/09/15 Птн 16:02:52 #28 №548926 
>>548923
У меня от этого кода ЗАКАТ СОЛНЦА ВРУЧНУЮ
comments powered by Disqus