문법 · Lua · beginner

에러와 pcall: 실패를 값으로

error/assert와 pcall로 실패를 잡고, 연습 코드에서 안전하게 다루는 법.

배우기 · Lua 문법 · 12분 · 5/7 · Lua · 에러

이 트랙 목차 (7)
  1. 1. Lua 기초: 변수·테이블·문자열
  2. 2. Lua 제어·반복·함수
  3. 3. 테이블 깊게: 배열부·해시부·ipairs
  4. 4. 문자열·패턴: match, gmatch, gsub
  5. 5. 에러와 pcall: 실패를 값으로
  6. 6. 모듈과 require 감각
  7. 7. 숫자 for와 인덱스 함정

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로 파서를 감싸면, 한 케이스만 터져도 전체를 잃지 않습니다.

체크리스트

  1. assert가 사용자 입력에 너무 엄격하지 않은가?
  2. 실패 시 반환값이 계약(문자열/숫자)과 맞는가?
  3. 에러 메시지를 출력에 실수로 섞지 않았는가?

연습

tonumber가 실패하는 문자열을 pcall/nil 패턴 두 가지로 처리해 보세요.

한 줄

> 실패는 예외로만 던지지 말고, nil/메시지 또는 pcall로 다룬다.

관련 짧은 원리

관련 문제