스택스/클래리티

[클래리티] 8. 제어 흐름과 예외 처리

라이튼 2024. 10. 15. 15:07

이전글

 

[클래리티] 7. 함수

이전글 [클래리티] 6. 맵이전글 [클래리티] 5. 변수와 상수2이전글 [클래리티] 4. 변수와 상수1이전글 [클래리티] 3. 클래리티 기본 규칙이전글 [클래리티] 2. 히로 플랫폼(Hiro Platform)히로 플랫폼

kwjdnjs.tistory.com

 

제어 흐름과 예외 처리

 이번 글에서는 클래리티의 제어 흐름과 예외 처리에 대해 알아보겠습니다.

 

1. asserts!

 asserts!는 특정 조건에서 에러를 발생시키기 위한 함수입니다. 기본적으로 (asserts! true (err "failed"))처럼 사용합니다.

 

 (asserts! true (err "failed"))의 경우 true를 반환합니다.

 (asserts! false (err "failed"))의 경우 에러 메시지인 failed를 반환하게 됩니다.

 

 asserts!가 사용될 경우 begin으로 시작된 동작이 중단되고 즉시 에러 메시지를 반환하게 됩니다. 즉, 다음과 같이 begin과 함께 asserts!를 사용하면 if문을 대체하는 효과를 낼 수 있습니다.

(define-public (asserts-example (input bool))
    (begin
        (asserts! input (err "the assertion failed"))
        (ok "end of the function")
    )
)

(print (asserts-example true))
(print (asserts-example false))

 

 이러한 방식이 훨씬 직관적이기 때문에 클래리티에서 권장되고 있습니다.

 

2. try!

 try!는 옵셔널이나 응답 형식의 값을 받아서 내부의 값을 추출합니다. 예를 들어 some으로 된 값을 다음과 같이 try!를 이용해 추출할 수 있습니다.

 

(try! (some "wrapped string"))

 

 다만 try!는 none 값과 err 값은 추출하지 않습니다. 대신 값을 그대로 반환하고 begin으로 시작된 동작을 중단합니다. 예를 들어 다음과 같은 경우 end of the function을 출력하지 않고 err를 반환하며 함수가 종료됩니다.

 

(define-public (try-example (input (response uint uint)))
    (begin
        (try! input)
        (ok "end of the function")
    )
)

(print (try-example (err u2)))

 

3. unwrap

 이전에 변수와 상수를 다루면서 some으로 묶여있는 값을 풀기 위해서는 unwrap-panic을 사용할 수 있다고 했습니다. unwrap-panic의 경우 오류가 발생했을 때 try!와는 다르게 err를 반환하는 것이 아니라 런타임 에러를 반환하고 종료합니다.

 

 사실 이러한 unwrap-panic 외에도 unwrap 함수가 여러 개 존재합니다.

 

 먼저 try!와 비슷한 동작을 하는 unwrap! 입니다. try!와 거의 비슷하게 동작하지만, try!와는 다르게 err나 none을 반환해야 할 경우 두 번째 인자로 지정된 err를 반환하게 됩니다.

 

(unwrap! (some none) (err "unwrap failed"))

 

  이외에도 unwrap-panic과 완전히 반대 동작을 하는 unwrap-err-panic도 있습니다. unwrap-err-panic은 err가 들어올 경우 err를 반환하고, 그 이외의 경우에는 런타임 에러를 반환합니다.

 

(unwrap-err-panic (err false))

 

 비슷하게 unwrap!과 반대되는 동작을 하는 unwrap-err!도 존재합니다. unwrap-err!는 첫 번째 인자로 err가 들어온 경우 해당 err 값을 반환하고 그렇지 않은 경우 두 번째 인자의 err를 반환합니다.

 

(unwrap-err! (err false) (err "unwrap failed"))

 

 

'스택스 > 클래리티' 카테고리의 다른 글

[클래리티] 7. 함수  (0) 2024.10.07
[클래리티] 6. 맵  (0) 2024.08.20
[클래리티] 5. 변수와 상수2  (0) 2024.07.16
[클래리티] 4. 변수와 상수1  (0) 2024.07.05
[클래리티] 3. 클래리티 기본 규칙  (1) 2024.06.10