pcall()을 사용한 보호된 호출
Coddy Lua 여정의 로직 및 흐름 제어 (Logic & Flow) 섹션에 포함된 레슨 — 54개 중 33번째.
error()는 문제가 발생했을 때 프로그램을 중단시키지만, 때로는 프로그램이 종료되지 않고 에러를 처리하고 싶을 수 있습니다. Lua의 pcall() 함수를 사용하면 실패할 수 있는 코드를 안전하게 실행할 수 있습니다.
pcall()이라는 이름은 "protected call"(보호된 호출)을 의미합니다. 오류를 잡아내는 보호 계층으로 함수 호출을 감쌉니다. 프로그램이 중단되는 대신, pcall()은 무슨 일이 일어났는지에 대한 정보를 반환합니다.
기본 문법은 다음과 같습니다:
local status, result = pcall(functionName, arg1, arg2)pcall() 함수는 두 가지 값을 반환합니다. 첫 번째는 불리언 상태 값입니다: 함수가 성공하면 true, 에러가 발생하면 false입니다. 두 번째 값은 상태에 따라 달라집니다—성공한 경우 함수의 반환 값이며, 에러가 발생한 경우 에러 메시지입니다.
실용적인 예는 다음과 같습니다:
function divide(a, b)
if b == 0 then
error("Cannot divide by zero")
end
return a / b
end
local success, result = pcall(divide, 10, 0)
if success then
print("Result: " .. result)
else
print("Error caught: " .. result)
end이 예제에서 0으로 나누기는 에러를 발생시키지만, 중단되는 대신 pcall()이 이를 감쌉니다. 프로그램은 계속 실행되며 status 값을 확인하여 에러를 안전하게 처리할 수 있습니다.
챌린지
쉬움operation, a, 그리고 b를 인자로 받아 계산 결과나 에러 메시지를 반환하는 safeCalculate 함수를 작성하세요.
이 함수는 요청된 연산을 안전하게 수행하기 위해 pcall()을 사용해야 합니다. operation 문자열에 따라 계산을 수행하는 내부 함수를 작성한 후, 에러를 포착할 수 있도록 pcall()로 감싸세요.
로직:
- 연산 유형을 확인하고 계산을 수행하는 내부 함수를 생성합니다.
- "add"의 경우,
a + b를 반환합니다. - "subtract"의 경우,
a - b를 반환합니다. - "multiply"의 경우,
a * b를 반환합니다. - "divide"의 경우,
b가 0인지 확인하여 참이면error("Division by zero")를 호출하고, 그렇지 않으면a / b를 반환합니다. - 그 외 다른 연산의 경우,
error("Invalid operation")을 호출합니다. pcall()을 사용하여 내부 함수를 실행합니다.- 성공하면
"Result: "뒤에 결과가 붙은 문자열을 반환합니다. - 에러가 발생하면
"Error: "뒤에 에러 메시지가 붙은 문자열을 반환합니다.
매개변수:
operation(string): 수행할 연산 ("add", "subtract", "multiply", 또는 "divide")a(number): 첫 번째 피연산자b(number): 두 번째 피연산자
반환값: 계산 결과가 뒤따르는 "Result: " 또는 에러 메시지가 뒤따르는 "Error: "를 포함하는 문자열 (string)
직접 해보기
function safeCalculate(operation, a, b)
-- 여기에 코드를 작성하세요
-- Note: 테스트 러너는 오류 메시지에 줄 번호가 포함될 것으로 예상합니다.
-- 오류 호출이 예상된 줄에 있도록 하거나 테스트 러너가 허용하는 경우 간단한 오류 메시지를 사용하세요.
end이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.