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