В Фаро (и других диалектах) исключение ZeroDivide
является возобновляемым. Зачем?. Например, если вы оцениваете 1/0
и затем продолжаете, ответ будет ZeroDivide
. Почему это? Должно ли не возобновляться ZeroDivide
?Почему ZeroDivide возобновляется?
EDIT: Давайте рассмотрим этот вопрос более подробно.
Проблема в том, что если исключение случается, то мы получаем исключение ZeroDivide
. Поэтому единственная причина, по которой я могу думать о том, чтобы сделать это исключение возобновляемым, заключается в том, чтобы включить следующее:
[a/b] on: ZeroDivide do: [:ex | ex resume: self anythingButTheQuotient],
Право?
Но это могло бы быть записано
[a/b] on: ZeroDevide do: [self anythingButTheQuotient]
без необходимости исключения быть возобновляем.
Возобновляемые исключения имеют смысл, если есть «интересные» #defaultAction
. Но это, похоже, не так с ZeroDivide
.
Можно поддаться искушению сказать, что во многих случаях имеет такой код:
b = 0 ifTrue: [^0] ifFalse: [^a/b]
так почему бы не используя 0 как #defaultAction
? Это сделало бы приведенный выше код более простым (в тех случаях) и потребовал бы только специального обработчика в (возможно) немногих, которые должны вести себя по-другому. Однако это было бы очень плохое решение, потому что поведение по умолчанию скрывало бы ошибки, которые, как мы все знаем, позже проявляют худшее.