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()이 이를 잡아냅니다. 프로그램은 계속 실행되며 상태 값을 확인하여 오류를 유연하게 처리할 수 있습니다.
챌린지
쉬움operation, a, b를 인자로 받아 계산 결과 또는 에러 메시지를 반환하는 safeCalculate 함수를 작성하세요.
이 함수는 요청된 수학 연산을 안전하게 수행하기 위해 pcall()을 사용해야 합니다. 연산 문자열에 따라 계산을 수행하는 내부 함수를 만들고, 에러를 포착하기 위해 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)
치트 시트
pcall() 함수(protected call)를 사용하면 프로그램이 중단되지 않고 실패할 가능성이 있는 코드를 안전하게 실행할 수 있습니다.
기본 구문:
local status, result = pcall(functionName, arg1, arg2)pcall()은 두 개의 값을 반환합니다:
- status: 함수가 성공하면
true, 오류가 발생하면false - result: 성공 시 함수의 반환 값, 또는 오류 발생 시 오류 메시지
예제:
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이것은 프로그램이 중단되는 대신 오류를 포착하여, 프로그램이 계속 실행되고 오류를 유연하게 처리할 수 있도록 합니다.
직접 해보기
function safeCalculate(operation, a, b)
-- 여기에 코드를 작성하세요
end
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.