2011-10-20 2 views

답변

6

# on : do 블록을 #ensure :가 첨부 된 다른 블록으로 래핑 할 수 있습니다.

+0

아 참으로. 나는 그것의 생각을했지만 어쨌든 #on : do :와 #ensure : #value를 보내기 때문에 내부 블록을 두 번 실행할 것이라고 생각했다. – milan

+1

'#ensure :'의'# value'의 send는 그 내용을 평가할 것이고, 그 내용에'#on : do :'를 보내면, 마지막으로'# value'를 가장 안쪽 블록에 보낼 것입니다. 유용한 일을하십시오. 즉, 두 개의 '# 값'전송이 다른 블록으로 전송됩니다. –

1

나는 당신의 질문을 이해하지만, 내가 한 당신은 "이 트리거되는 경우 어떻게 예외를 처리합니까 그렇지 않으면 정상적인 실행을 계속"을 의미하는 경우, 이것은 당신이 무엇을 할 수 있는지 모르겠어요 :

[self doWhatever] on: SomeException do: [self handleSomeException]. 
self continueNormally. 

캡처 할 수있는 예외의 종류를 보려면 Exception의 모든 하위 클래스를 확인하십시오.

희망이있었습니다.

+0

finally 블록은 실행이 정상적으로 계속 될 때 실행될뿐만 아니라 예외가 Smalltalk #ensure :와 같은 스택을 언 롤링 할 때 실행됩니다. 다른 답변을 참조하십시오. –

5

당신이 정말로 그것을 필요하면, 당신은 BlockClosure에 프로토콜을 추가 할 수 있습니다 : 캐치 : 마지막으로 : 자바에 불과 시도처럼 동작합니다

#on: anErrorOrSet do: errorBlock ensure: finallyBlock 
    [ self on: anErrorOrSet do: errorBlock ] 
    ensure: finallyBlock 

. 사용자의 요구에 일치가없는 경우, 스몰 토크의 마법 (물론, 그것의 작은 부분)의

, 당신은 항상 그것을 확장 할 수 있습니다 :)

1

이 당신이 상자 밖으로 쓸 수있는 방법입니다 거의 모든 스몰 토크 방언에서.

[[ "try{}" ] 
    on: Error 
    do: [:ex | "catch{}"]] 
     ensure: ["finally{}"] 

또는 BlockClosure를 @EstebanLM 권장으로 확장 할 수 있습니다.

관련 문제