IMCAT.DEV
로그인 가입
Lua 입문 문법

Lua 기본 에러 처리

Lua 기본 에러 처리 — 초급

Lua 기본 에러 처리

1. 도입 (왜 배워야 하는가)

Lua에서 에러 처리는 프로그램이 안정적으로 작동하도록 하는 데 필수적인 요소입니다. 실무에서는 사용자에게 더 나은 경험을 제공하기 위해 예기치 않은 상황을 적절하게 처리해야 합니다. 예를 들어, 쇼핑몰 웹사이트에서 사용자가 장바구니에 없는 상품을 구매하려고 할 때, 이를 적절히 처리하지 않으면 프로그램이 갑자기 종료되거나 잘못된 정보를 사용자에게 전달할 수 있습니다. 이러한 경우, 에러 처리를 통해 프로그램의 흐름을 제어하고 사용자에게 명확한 피드백을 제공할 수 있습니다.

에러 처리를 하지 않으면 프로그램이 중단되거나 예기치 않은 결과를 초래할 수 있으며, 이는 사용자에게 신뢰성을 떨어뜨리는 결과를 초래할 수 있습니다.

2. 핵심 개념 설명

에러 처리는 프로그램이 예외적인 상황에서도 안정적으로 작동하도록 돕는 기능입니다. Lua에서는 pcall과 xpcall 함수를 사용하여 에러를 처리할 수 있습니다. 이를 통해 코드의 오류를 감지하고, 오류가 발생했을 때의 대응을 정의할 수 있습니다.

  • pcall: "protected call"의 약자로, 함수 호출 시 발생할 수 있는 에러를 안전하게 처리합니다. 비유하자면, 안전벨트를 매고 운전하는 것과 같습니다. 사고가 나더라도 보호받을 수 있습니다.
  • xpcall: pcall과 유사하지만, 에러 핸들러를 추가적으로 정의할 수 있습니다. 이는 마치 안전벨트를 매고 운전하면서 사고가 나면 응급처치를 준비하는 것과 같습니다.
  • 용어설명
    pcall함수 호출 시 발생하는 에러를 안전하게 처리
    xpcall에러 핸들러를 추가하여 더욱 정교한 에러 처리

    3. 기본 코드 예제

    function divide(a, b)
        return a / b
    end
    
    local status, result = pcall(divide, 10, 0)
    if status then
        print("결과:", result)
    else
        print("에러 발생:", result)
    end
  • 실행 결과:
  • 에러 발생: attempt to divide by zero
  • 코드 동작 설명:
  • 1. divide라는 함수를 정의하고, 두 수를 나누는 기능을 구현합니다. 2. pcall 함수를 사용하여 divide 함수를 호출합니다. 첫 번째 인수는 나누고자 하는 수 10과 0입니다. 3. 나누기 연산에서 0으로 나누려 하므로 에러가 발생합니다. 4. status는 false가 되며, 두 번째 반환 값인 result는 에러 메시지를 포함합니다. 5. 에러가 발생했음을 알리기 위해 "에러 발생:" 메시지와 함께 에러 내용을 출력합니다.

    4. 실전 활용 예제

    예제 1: 파일 읽기

    쇼핑몰에서 상품 정보를 파일에서 읽어올 때, 파일이 존재하지 않는 경우를 처리할 수 있습니다.

    function readFile(filename)
        local file, err = io.open(filename, "r")
        if not file then
            return nil, err
        end
        local content = file:read("*a")
        file:close()
        return content
    end
    
    local status, result = pcall(readFile, "products.txt")
    if status then
        print("파일 내용:", result)
    else
        print("에러 발생:", result)
    end

    예제 2: 사용자 입력 처리

    사용자가 입력한 나이를 검증하는 경우:

    function checkAge(age)
        if age < 0 then
            error("나이는 음수가 될 수 없습니다.")
        end
        return "유효한 나이입니다."
    end
    
    local status, result = pcall(checkAge, -5)
    if status then
        print(result)
    else
        print("에러 발생:", result)
    end

    5. 흔한 실수와 주의사항

  • 실수 1: pcall의 반환값을 잘못 이해하기
  • - 잘못된 코드:

        local result = pcall(divide, 10, 0)
        print("결과:", result)  -- 에러 발생

    - 올바른 코드:

        local status, result = pcall(divide, 10, 0)
  • 실수 2: 에러 핸들러를 정의하지 않고 xpcall 사용
- 잘못된 코드:
    local status, result = xpcall(divide, nil, 10, 0)

- 올바른 코드:

    local function errorHandler(err)
        return "커스텀 에러: " .. err
    end
    local status, result = xpcall(divide, errorHandler, 10, 0)

6. 정리

  1. 에러 처리는 프로그램의 안정성을 높이며, 사용자 경험을 개선합니다.
  2. Lua에서 pcall과 xpcall을 사용하여 에러를 안전하게 처리할 수 있습니다.
  3. 에러 발생 시 적절한 피드백을 제공하여 프로그램의 신뢰성을 높일 수 있습니다.
  4. 에러 핸들링 코드를 작성할 때는 반환값을 정확히 이해하고 사용하는 것이 중요합니다.

다음에 학습하면 좋은 주제는 Lua의 테이블과 메타테이블입니다. 이를 통해 더 복잡한 데이터 구조와 객체 지향 프로그래밍을 구현할 수 있습니다.