error와 assert
error("bad input")
assert(n ~= nil, "n required")
assert는 조건이 거짓이면 에러를 냅니다.
연습 문제에서는 잘못된 입력을 조용히 기본값으로 돌리거나, 명시적 return이 더 읽기 쉬운 경우가 많습니다.
pcall
local ok, result = pcall(function()
return tonumber(s) + 1
end)
if not ok then
return "err"
end
pcall은 성공 여부(boolean)와 결과(또는 에러 메시지)를 돌려줍니다.
라이브러리 호출이 예외를 던질 수 있을 때 감쌉니다.
xpcall
디버그 트레이스가 필요하면 xpcall에 메시지 핸들러를 넘깁니다.
이 사이트 연습 규모에서는 pcall이면 충분한 경우가 많습니다.
nil 전파
Lua는 예외보다 nil + 메시지 패턴도 흔합니다.
local n = tonumber(s)
if not n then return nil, "not a number" end
호출측:
local n, err = parse(s)
if not n then return err end
문제 풀이 팁
채점기는 보통 예외보다 틀린 출력을 보여 줍니다.
그래도 로컬에서 pcall로 파서를 감싸면, 한 케이스만 터져도 전체를 잃지 않습니다.
체크리스트
assert가 사용자 입력에 너무 엄격하지 않은가?- 실패 시 반환값이 계약(문자열/숫자)과 맞는가?
- 에러 메시지를 출력에 실수로 섞지 않았는가?
연습
tonumber가 실패하는 문자열을 pcall/nil 패턴 두 가지로 처리해 보세요.
한 줄
> 실패는 예외로만 던지지 말고, nil/메시지 또는 pcall로 다룬다.