Menu
Coddy logo textTech

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 값을 확인하여 에러를 안전하게 처리할 수 있습니다.

challenge icon

챌린지

쉬움

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
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

로직 및 흐름 제어 (Logic & Flow)의 모든 레슨