Menu
CoddyTech

pcall()을 사용한 보호된 호출

Coddy Lua 여정의 논리와 흐름 제어 섹션에 포함된 레슨. 54개 중 33번째.

문제가 발생했을 때 error()는 프로그램을 중단하지만, 때로는 충돌 없이 오류를 처리하고 싶을 수 있습니다. Lua의 pcall() 함수를 사용하면 실패할 수 있는 코드를 안전하게 실행할 수 있습니다.

pcall()이라는 이름은 "보호된 호출"을 뜻합니다. 이 함수는 함수 호출을 보호막으로 감싸 오류를 잡아냅니다. 프로그램이 충돌하는 대신 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()이 오류를 잡아냅니다. 프로그램은 계속 실행되며 상태 값을 확인해 오류를 적절히 처리할 수 있습니다.

pcall()은 예상하지 못한 버그를 포함해 호출 내부의 모든 오류를 잡아내고 모두 같은 방식으로 보고한다는 점을 기억하세요. 따라서 실패할 수 있는 호출만 감싸고, 예상되는 실패에는 이전 강의에서처럼 nil과 메시지를 반환하는 함수를 사용하는 편이 좋습니다.

challenge icon

챌린지

쉬움

safeCalculate 함수는 operation, a, b를 받아 계산 결과 또는 오류 메시지를 반환합니다.

요청된 수학 연산을 안전하게 수행하려면 함수에서 pcall()을 사용해야 합니다. 연산 문자열을 기준으로 계산을 수행하는 내부 함수를 만든 다음, 오류를 포착할 수 있도록 pcall()로 감싸세요.

로직:

  • 연산 유형을 확인하고 계산을 수행하는 내부 함수를 만드세요.
  • "add"인 경우 a + b를 반환하세요.
  • "subtract"인 경우 a - b를 반환하세요.
  • "multiply"인 경우 a * b를 반환하세요.
  • "divide"인 경우 b가 0인지 확인하고, 0이면 error("Division by zero", 0)를 호출하세요. 그렇지 않으면 a / b를 반환하세요.
  • 그 외의 연산인 경우 error("Invalid operation", 0)을 호출하세요.
  • 내부 함수를 실행할 때 pcall()을 사용하세요.
  • 성공하면 "Result: " 뒤에 결과를 붙여 반환하세요.
  • 오류가 발생하면 "Error: " 뒤에 오류 메시지를 붙여 반환하세요.

error()의 두 번째 인수로 0을 전달하세요. 이 인수는 오류 수준이며, 0을 지정하면 Lua가 메시지 앞에 파일 이름과 줄 번호를 표시하지 않으므로 반환되는 문자열은 정확히 "Error: Division by zero"입니다.

매개변수:

  • operation (문자열): 수행할 연산("add", "subtract", "multiply", 또는 "divide")
  • a (숫자): 첫 번째 피연산자
  • b (숫자): 두 번째 피연산자

반환값: 계산 결과 앞에 "Result: "가 붙은 문자열 또는 오류 메시지 앞에 "Error: "가 붙은 문자열(문자열)

직접 해보기

function safeCalculate(operation, a, b)
    -- 여기에 코드를 작성하세요
    -- 참고: Lua가 메시지 앞에 파일 이름과
    -- 줄 번호를 추가하지 않도록 error(message, 0)을 호출하세요.
end
quiz icon실력 점검

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

논리와 흐름 제어의 모든 레슨

직접 연습해 보세요: 온라인 Lua 컴파일러