2014-12-28 2 views
3

В Фаро (и других диалектах) исключение 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? Это сделало бы приведенный выше код более простым (в тех случаях) и потребовал бы только специального обработчика в (возможно) немногих, которые должны вести себя по-другому. Однако это было бы очень плохое решение, потому что поведение по умолчанию скрывало бы ошибки, которые, как мы все знаем, позже проявляют худшее.

ответ

3

Да, это удивительно на первый взгляд, но стандарт ANSI говорит:

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

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

[self doSomethingComplex] 
    on: ZeroDivide 
    do: 
     [:exception | 
     "Handle zero divide as inf/nan as if performed in floating point arithmetic" 
     exception resume: exception dividend asFloat/0.0] 

В Squeak или Pharo см ссылки на переменную signalContext экземпляра в классе Exception. Вы увидите, что возобновление является вашим единственным вариантом для возврата к сигналу.

Смежные вопросы