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()이 이를 잡아냅니다. 프로그램은 계속 실행되며 상태 값을 확인하여 오류를 유연하게 처리할 수 있습니다.

challenge icon

챌린지

쉬움

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

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

Logic & Flow의 모든 레슨