Factor의 오류 시스템은 세 부분으로 이루어져 있어요: 오류를 알리는 throw, 오류를 처리하는 recover, 그리고 나만의 오류 종류를 정의하는 ERROR:예요.
throwthrow는 (kernel에 있는) 오류를 발생시켜요. 인자는 어떤 값이든 될 수 있어요. 문자열, 숫자, 튜플 등 무엇이든 나중에 살펴볼 수 있는 오류가 돼요.
! DOCTEST: SKIP
"file not found" throw
throw는 반환하지 않아요. 현재 word의 나머지 부분은 건너뛰어요.
recoverrecover는 (continuations에 있는) Factor의 try/catch예요. try quotation과 recovery quotation을 받아요:
recover ( try recovery -- )
try가 아무것도 던지지 않고 끝나면 recovery는 무시돼요. try가 오류를 던지면, 그 오류가 스택에 푸시되고 recovery가 실행돼요:
[ "boom" throw ] [ drop "caught" ] recover .
! => "caught"
[ "ok" ] [ drop "never runs" ] recover .
! => "ok"
kernel의 when은 자연스러운 짝이에요. 스택 맨 위의 값이 참으로 평가될 때만 quotation을 실행해요:
: check-positive ( n -- )
0 < [ "negative!" throw ] when ;
ERROR:ERROR:는 튜플 클래스를 정의하고, 동시에 새로운 인스턴스를 만들어 던지는 word도 정의해요:
! DOCTEST: SKIP
ERROR: not-found path ;
"/missing" not-found
! throws T{ not-found { path "/missing" } }
슬롯이 없는 오류는 그냥 ERROR: name ;예요. name을 호출하면 빈 인스턴스를 던져요. ERROR:로 정의한 튜플에는 클래스 술어 name?이 따라오는데, 잡은 오류가 그 타입인지 검사할 때 쓸 수 있어요.
잡은 오류는 그냥 튜플이라서, 각 ERROR: 슬롯에는 다른 튜플과 똑같이 자동 생성된 slot>> 리더가 따라와요.
! DOCTEST: SKIP
{
T{ not-found { path "/a" } }
T{ not-found { path "/b" } }
}
[ path>> ] map . ! => { "/a" "/b" }
신문 공장의 새 품질 관리자인 Elena가 생산실을 모니터링할 작은 소프트웨어를 하나 만들어 달라고 부탁해요.
ERROR: 파싱 워드로 오류 튜플 클래스 machine-error를 정의해요. 슬롯은 필요 없어요.
machine-error ! throws a fresh machine-error
check-humidity를 정의해요. 이 워드는 스택에서 습도 측정값을 하나 꺼내고, 그 값이 70을 초과하면 문자열 "humidity too high"를 throw해요. 그렇지 않으면 아무것도 반환하지 않아요.
50 check-humidity ! returns nothing
80 check-humidity ! throws "humidity too high"
check-temperature를 정의해요. 온도 측정값을 하나 꺼내고, 그 값이 500을 초과하면 문자열 "temperature too high"를 throw해요. 그렇지 않으면 아무것도 반환하지 않아요.
400 check-temperature ! returns nothing
600 check-temperature ! throws "temperature too high"
monitor는 스택에서 습도와 온도를 꺼내 두 검사를 모두 실행하도록 정의해요. 두 검사 중 하나라도 throw하면 monitor는 대신 새 machine-error를 throw해야 해요. 둘 다 통과하면 monitor는 아무것도 반환하지 않아요.
50 400 monitor ! returns nothing
80 400 monitor ! throws a machine-error
50 600 monitor ! throws a machine-error
monitor-batch는 { humidity temperature } 측정값들의 배열을 받아서, 그중 몇 개가 실패하는지(즉, 몇 개가 monitor를 throw하게 만드는지)를 반환하도록 정의해요.
{ { 50 400 } { 80 400 } { 50 600 } { 60 200 } } monitor-batch .
! => 2
Exercism에 가입하고 Factor 트랙을 개념 47개연습 문제 163개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.