2014-12-28 2 views
3

Pharo (및 다른 방언)에서는 ZeroDivide 예외가 다시 시작됩니다. 왜?. 예를 들어, 1/0을 평가하고 계속 진행하면 대답은 ZeroDivide입니다. 왜 이런거야? ZeroDivide을 재개 할 수 없어야합니까?왜 ZeroDivide를 다시 시작할 수 있습니까?

수정 : 이 문제에 대해 자세히 살펴 보겠습니다.

여기서 예외는 예외가 발생하면 ZeroDivide 예외가 발생한다는 것입니다. 따라서이 예외를 다시 시작 가능하게 만들 수있는 유일한 이유는 다음을 활성화하는 것입니다.

right?

는하지만이 또한 재개 될 예외없이

[a/b] on: ZeroDevide do: [self anythingButTheQuotient] 

을 기록 할 수 있었다.

재시작 가능한 예외는 "흥미로운"#defaultAction이있는 경우에 의미가 있습니다. 그러나 ZeroDivide의 경우는 그렇지 않습니다.

b = 0 ifTrue: [^0] ifFalse: [^a/b] 

그래서 왜 #defaultAction로 0을 사용하지 :

하나는 많은 경우에 하나 이러한 종류의 코드를 가지고 말을 유혹 할 수 있을까? 이는 위의 코드를 (이 경우) 더 간단하게 만들고, 다르게 행동해야하는 (틀림없이) 몇 가지 특수 처리기 만 필요합니다. 그러나 기본 동작을 통해 오류를 숨길 수 있기 때문에 이것은 매우 나쁜 결정입니다. 우리 모두가 알다시피, 나중에 오류를 나타냅니다.

답변

3

예,이 첫눈에 놀라운 일이지만, ANSI 표준은 말한다 :

제로 나누기 예외 때문에 이러한 예외를 신호이 프로토콜 의 모든 메시지가 궁극적으로 보낸 사람에게 반환 할 수 있습니다 재개합니다.

예제는 간단했지만 위의 몇 가지 방법을 처리기에 설치하면 시그널링 된 예외를 다시 시작하는 것이 쉽지 않습니다.

이죠 또는 Pharo에서
[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] 

, 클래스 ExceptionsignalContext 인스턴스 변수에 대한 참조를 참조. 다시 시작하는 것이 서명자에게 제어 권한을 되돌릴 수있는 유일한 옵션임을 알 수 있습니다.