실패는 두려울 수 있지만 프로그래밍의 중요한 일부분입니다. 실패를 사용하여 디버깅하거나, 프로그램의 한계를 찾아내거나, 무엇을 하면 안 되는지 빠르게 알아낼 수 있습니다.
허용되는 실패
Verse에서 실패 는 특정한 의미를 갖습니다. 항상 무언가가 작동하지 않는다는 것을 뜻하지는 않습니다. 실패는 프로그램의 작업을 제어하는 한 가지 방식입니다.
4강에서 예 또는 아니요 로 답하는 질문을 하는 코드를 작성하는 방법에 대해 배웠습니다.
var Tired: logic = false
var WhatToWatch: string = “nothing”
if (Tired?):
set WhatToWatch = “your eyelids”
else:
set WhatToWatch = “cartoons”
Print(“You should watch {WhatToWatch}”)
# 만화를 봐야 합니다
질문을 하는 코드는 실패 가능 표현식(failable expression) 으로 작성됩니다. 위 예시에서 Tired?
는 실패 가능 표현식입니다.
실패 가능 표현식은 프로그램 전체를 중단시키는 오류를 피하기 위해 사용됩니다. 예를 들어 0으로 나누는 것은 불가능합니다. 코드에서 이를 시도하면 크래시가 발생하겠지만, 다음과 같은 Verse 코드는 문제 없이 실행됩니다.
if (5/0):
Print("Whoa!")
else:
Print("You can't do that!")
이러한 오류를 피하기 위해 Verse에서는 실패 가능 표현식을 실패 컨텍스트(failure context) 에서 작성하게 합니다. 실패 컨텍스트는 실패 가능 표현식이 안전하게 실패할 장소를 제공합니다. 위 예시에서 5/0
은 실패 가능 표현식이며, if()
는 실패 컨텍스트입니다. 이 두 Verse 개념에 대해 자세히 알아보려면 아래 내용을 계속 읽어보시기 바랍니다.

실패 가능 표현식
Verse에서 실패 가능 표현식을 작성하는 방법에는 여러 가지가 있습니다. 표현식에서 '예' 또는 '아니요'로 답하는 질문을 하는 경우, 이는 아마 실패 가능할 것입니다.
실패 가능 표현식에서 물을 수 있는 질문 유형 몇 가지는 다음과 같습니다.
- 이 두 변수 중에 무엇이 더 큰가요? 아니면 두 변수가 같나요?
- 이 변수가
true
로 설정되어 있나요? - 이 변수가 값으로 설정되어 있나요?
- 이 표현식이 오류를 발생시키나요?
이러한 질문의 답이 예 인 경우 표현식은 성공 합니다. 하지만 이러한 질문의 답이 아니요 인 경우에는 표현식이 실패 합니다. 성공 또는 실패 이후 발생하는 일은 코드 작성 방식에 따라 달라집니다.
비교 표현식
비교 표현식 은 <
(보다 작음), ` >(보다 큼), 또는
<>(같음) 같은 비교 연산자를 사용하며 실패 가능합니다. 다음 예시에서
5 < 4` 는 실패하는 실패 가능 표현식입니다.
if (5 < 4):
Print(“This will never print.”)
5 < 4
표현식은 5가 4보다 작은지 묻는 것과 같습니다. 답은 아니요 이므로 표현식은 실패하며, if
표현식 아래에 들여쓰기된 코드 블록은 실행되지 않습니다.
다음 예시에서는 실패 가능 표현식 MousetrapsSet <> MiceCaught
를 살펴보겠습니다. 이 실패 가능식은 MousetrapsSet 값과 MiceCaught 값이 다른지 묻고 있습니다.
MousetrapsSet := 3
MiceCaught := 0
if (MousetrapsSet<>MiceCaught):
Print(“Need more cheese!”)
MousetrapsSet
는 3이고 MiceCaught
는 0이므로 이번에는 질문의 답이 예 이며, 표현식이 성공하고 코드 블록이 실행됩니다.
결정 표현식
and
, or
및 not
연산자를 사용하는 결정 표현식은 실패 가능합니다. 다음 예시에서 MousetrapsForSale > 0 and Coins >= MousetrapCost
는 성공하는 실패 가능 표현식입니다. MousetrapsForSale
이 5(0보다 큼)이고 Coins
은 30이며 MousetrapCost
는 20(30이 20보다 큼)이기 때문입니다. 두 표현식이 각각 성공하므로 전체 표현식이 성공합니다.
MousetrapsForSale := 5
MousetrapCost := 20
Coins := 30
if (MousetrapsForSale > 0 and Coins >= MousetrapCost):
Print(“You can buy mouse traps.”)
쿼리 표현식
쿼리 표현식도 실패 가능합니다. ?
연산자를 사용하여 logic
값이 true
인지와 같은 특정 값을 체크합니다. 다음 예시에서 MousetrapStoreOpen?
은 실패하는 실패 가능 표현식입니다. MousetrapStoreOpen
이 false
이기 때문입니다.
var MousetrapStoreOpen : logic = false
if (MousetrapStoreOpen?):
Print(“Come on in!”)
실패 컨텍스트
위의 모든 코드 예시에서 if
표현식은 ()
안에 포함된 실패 가능 표현식에 대한 실패 컨텍스트입니다. 실패 컨텍스트는 실패했을 때 무슨 일이 일어나는지 결정하므로, 실패 표현식이 안전하게 실패할 장소를 제공합니다.
이전 강좌에서 배웠듯이 if
에서 표현식이 실패하면 if
코드 블록 내의 코드는 실행되지 않습니다.
if
는 실패 컨텍스트를 만들기 때문에 코드 블록 안에 원하는 만큼 실패 가능 표현식을 넣어도 됩니다. 그 표현식 중 하나라도 실패하면 코드 블록의 이전 표현식은 실행 취소, 즉 롤백(roll back) 됩니다.
()
를 사용하지 않고 if
표현식을 작성하는 방법이 있습니다. 이 방식은 표현식을 많이 써야 하는 경우에 좀 더 유용합니다. 예시는 다음과 같습니다.
MousetrapsSet:int = 5
var MiceCaught:int = 0
var BreakTime:logic = false
if:
MousetrapsSet > 0
set BreakTime = true
MiceCaught > 0
if (BreakTime?):
Print("Take a break!")
else:
Print("Catch some mice!")
실패 컨텍스트의 모든 표현식이 실패 가능할 필요는 없지만, 최소한 하나는 실패 가능해야 합니다. 위 예시에서 set BreakTime = true
는 실패 가능하지 않지만 나머지는 실패 가능 표현식입니다.
위 코드에서 if
아래에 들여쓰기된 모든 표현식은 실패 컨텍스트 내에 있습니다. 따라서 3개의 표현식이 모두 실행됩니다.
MousetrapsSet > 0
이 성공합니다.- 표현식
set BreakTime = true
가 실행됩니다. 실패 가능하지 않으므로 실패 체크가 없습니다. - 하지만
MiceCaught > 0
은 실패합니다.
실패가 있었으므로 set BreakTime = true
를 포함하여 if
코드 블록 내의 모든 표현식은 롤백됩니다. 이는 코드가 전혀 실행되지 않은 것과 같습니다. 이 코드를 실행하면 'Catch some mice!'가 프린트됩니다.
프로그래밍을 하면서 다른 코드가 실행될 때만 실행되는 코드를 많이 보게 될 것입니다. 이것이 바로 실패 컨텍스트가 아주 유용한 이유 중 하나입니다. 종속 코드를 실패 컨텍스트로 그룹화하면 일반적인 버그를 피할 수 있습니다. 4강에서 영화를 보러 갈지 여부를 결정할 때 사용한 코드를 기억하시나요? 친구와 함께 가기로 결정했으니 표와 음료, 그리고 간식을 준비해야 합니다.
var Drinks:int = 4
var Snacks:int = 4
var Tickets:int = 3
var FriendsAvailable:int = 4
if:
Drinks >= FriendsAvailable
set Drinks -= FriendsAvailable
Snacks >= FriendsAvailable
set Snacks -= FriendsAvailable
Tickets >= FriendsAvailable
set Tickets -= FriendsAvailable
Print("Drinks Left: { Drinks }")
Print("Snacks Left: { Snacks }")
Print("Tickets Left: { Tickets }")
연산자 -=
은 빼기 와 할당 을 결합한 것입니다. 위 예시에서 set Tickets -= FriendsAvailable
은 set Tickets = Tickets - FriendsAvailable 과 같습니다. 이는 더하기(
+=), 곱하기(
*=), 나누기(
/=`)에서도 작동합니다.
친구들에게 줄 음료와 간식은 충분하지만 표가 부족합니다. 표가 없으면 친구들과 함께 영화를 볼 수가 없습니다. 이 상황을 해결하기 위해 코드를 작성할 수 있지만, 음료와 간식이 바닥나지는 않게 해야 합니다.
다행히 Tickets >= FriendsAvailable
표현식이 실행되면 실패하고, if
블록 내의 모든 코드는 롤백됩니다. 즉, Drinks
와 Snacks
변수가 다시 4
값을 갖게 됩니다.
요약
- Verse에서 실패 는 프로그램을 제어하는 방식입니다.
- 실패 표현식 은 성공하거나 실패할 수 있으며, 실패 컨텍스트 내에서 작성되어야 합니다. 성공 또는 실패 이후 발생하는 일은 코드 작성 방식에 따라 달라집니다.
- 실패 컨텍스트 는 실패 표현식이 안전하게 실패할 장소를 제공합니다. 실패 컨텍스트에서 발생한 모든 실패는 해당 컨텍스트 내의 모든 코드를 롤백 시켜 실행되지 않은 것으로 만듭니다.