작은 토크에서 try-catch-finally 관용구를 어떻게 실현합니까? on:do:
및 ensure:
이 표시되지만 on:do:ensure:
은 없습니다. 나는 뭔가를 놓치고 있어야합니다.try-catch-finally 작은 관용구의 관용어
5
A
답변
6
# on : do 블록을 #ensure :가 첨부 된 다른 블록으로 래핑 할 수 있습니다.
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 권장으로 확장 할 수 있습니다.
관련 문제
- 1. 기본값 인 Ruby 관용어
- 2. 이 관용구의 이름?
- 3. 일반적인 캐싱 관용구의 스레딩 의미
- 4. 녹아웃 관측 값 비교 용 관용어
- 5. "개인 생성자 캡처"관용구의 Java 예제는 무엇입니까?
- 6. 자바에서 컬렉션 요소의 고유 한 쌍을 가져 오는 관용어
- 7. 작은 방법 - 작은 sprocs
- 8. 내 작은 아포스트로피가 작은 상자처럼 보임
- 9. 작은 업데이트 및 작은 업그레이드 자동화하기
- 10. OpenMP가 가장 작은 가장 작은 타임 슬라이스
- 11. 작은 삼각형은
- 12. 작은 경기는
- 13. 작은 화면
- 14. N 개의 동시 판독기와 1 개의 생성자에 대한 관용어 또는 패턴
- 15. 정적 클래스의 여드름 관용구의 d (포인터)를 어떻게 초기화 할 수 있습니까?
- 16. 작은 파일 읽기 k 번 + 작은 쓰기 vs 큰 파일 읽기 k 번 + 작은 추가
- 17. Spotify Apps API로 작은 재생 버튼을 사용하여 작은 작은 미리보기 이미지를 만드는 방법은 무엇입니까?
- 18. emacs의 zencoding-mode 작성 방법 작은 따옴표의 작은 따옴표 사용
- 19. HBase, mongoDB, Cassandra - 작은 클러스터의 오버 헤드, 작은 데이터
- 20. .NET JIT 인라인은 다른 작은 함수를 호출하는 작은 함수입니까?
- 21. 모든 작은 따옴표를 문자열의 두 개의 작은 따옴표로 바꾸십시오.
- 22. 작은 글자가 작은 글자의 큰 글자 인 경우
- 23. 레일 3 : 양식 (작은 따옴표 문자)에 작은 따옴표 넣기
- 24. 범위가 작은 jdbc 쿼리를 시간별로 작은 청크로 변환
- 25. PHP 출력 작은 따옴표
- 26. 작은 문자열 최적화?
- 27. 작은 mysql 여기에 도움을주세요
- 28. 작은 URL은 어떻게 작동합니까?
- 29. ASP.NET 작은 따옴표는 '
- 30. javascript로 작은 도움 요청
아 참으로. 나는 그것의 생각을했지만 어쨌든 #on : do :와 #ensure : #value를 보내기 때문에 내부 블록을 두 번 실행할 것이라고 생각했다. – milan
'#ensure :'의'# value'의 send는 그 내용을 평가할 것이고, 그 내용에'#on : do :'를 보내면, 마지막으로'# value'를 가장 안쪽 블록에 보낼 것입니다. 유용한 일을하십시오. 즉, 두 개의 '# 값'전송이 다른 블록으로 전송됩니다. –