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

Lua 에러 처리 심화

Lua 에러 처리 심화 — 중급

에러 처리 심화

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

프로그래밍에서 에러 처리는 매우 중요한 주제입니다. 소프트웨어 개발에서는 예기치 않은 상황이 자주 발생할 수 있으며, 이를 적절히 처리하지 않으면 프로그램이 중단되거나 잘못된 결과를 초래할 수 있습니다. 예를 들어, 사용자 입력 오류, 네트워크 연결 실패, 파일 시스템 오류 등은 모두 프로그램의 정상적인 흐름을 방해할 수 있습니다.

에러 처리를 잘 하지 않으면, 사용자 경험이 나빠지고, 프로그램의 신뢰성이 떨어지며, 결국에는 회사의 이미지에 부정적인 영향을 미칠 수 있습니다. 따라서, 에러 처리에 대한 이해와 적용은 개발자의 필수적인 스킬입니다.

2. 핵심 개념 설명

에러 처리

에러 처리는 프로그램 실행 중 발생할 수 있는 오류를 감지하고 이에 대응하는 과정을 말합니다. 이를 통해 프로그램이 예기치 않게 종료되는 것을 방지하고, 사용자에게 명확한 피드백을 제공할 수 있습니다.

실생활 비유

에러 처리를 자동차의 안전장치에 비유할 수 있습니다. 예를 들어, 자동차의 브레이크 시스템이 고장나면 큰 사고로 이어질 수 있습니다. 마찬가지로, 프로그램의 에러 처리가 제대로 되어 있지 않으면 프로그램이 예고 없이 종료될 수 있습니다.

관련 용어 정리

용어설명
pcallLua에서 안전하게 함수를 호출하는 방법
xpcall에러 처리와 함께 사용자 정의 함수를 사용하는 방법
error사용자 정의 에러를 발생시키는 함수

3. 기본 코드 예제

에러 처리를 기본적으로 사용하는 방법은 pcall 함수입니다.

function divide(a, b)
    if b == 0 then
        error("0으로 나눌 수 없습니다.") -- 에러 발생
    end
    return a / b
end

local status, result = pcall(divide, 10, 0) -- 안전하게 divide 호출

if not status then
    print("에러 발생:", result) -- 에러 메시지 출력
else
    print("결과:", result)
end

실행 결과

에러 발생: 0으로 나눌 수 없습니다.

코드 한 줄씩 동작 설명

  1. function divide(a, b) - 두 수를 나누는 함수를 정의합니다.
  2. if b == 0 then - 분모가 0인지 확인합니다.
  3. error("0으로 나눌 수 없습니다.") - 분모가 0일 경우 에러를 발생시킵니다.
  4. return a / b - 정상적인 경우 나누기 결과를 반환합니다.
  5. local status, result = pcall(divide, 10, 0) - divide 함수를 안전하게 호출합니다. 에러 발생 시 status는 false가 되고 result는 에러 메시지를 포함합니다.
  6. if not status then - 호출 결과 에러가 발생했는지 확인합니다.
  7. print("에러 발생:", result) - 에러 메시지를 출력합니다.
  8. 4. 실전 활용 예제

    예제 1: API 호출에서의 에러 처리

    쇼핑몰에서 상품 정보를 외부 API에서 가져올 때, 네트워크 문제로 인해 호출이 실패할 수 있습니다.

    function fetchProduct(productId)
        local response, err = http.get("https://api.example.com/products/" .. productId)
        if not response then
            error("API 호출 실패: " .. err)
        end
        return response
    end
    
    local status, result = pcall(fetchProduct, "12345")
    if not status then
        print("에러 발생:", result)
    else
        print("상품 정보:", result)
    end

    예제 2: 파일 읽기에서의 에러 처리

    장바구니 정보를 파일에서 읽어올 때, 파일이 없거나 읽을 수 없는 경우를 처리합니다.

    function readCart(filename)
        local file, err = io.open(filename, "r")
        if not file then
            error("파일 열기 실패: " .. err)
        end
        local data = file:read("*a")
        file:close()
        return data
    end
    
    local status, cartData = pcall(readCart, "cart.txt")
    if not status then
        print("에러 발생:", cartData)
    else
        print("장바구니 데이터:", cartData)
    end

    5. 흔한 실수와 주의사항

    실수 1: 에러를 무시하기

    에러가 발생했을 때 이를 무시하고 계속 진행하면, 프로그램이 예기치 않게 종료될 수 있습니다.

    -- 잘못된 코드
    local result = pcall(divide, 10, 0) -- 에러 발생 무시
    print("결과:", result) -- 결과가 nil일 수 있음

    실수 2: 에러 메시지에 유용한 정보 부족

    에러 메시지가 불명확하면 문제를 해결하기 어렵습니다.

    -- 잘못된 코드
    function divide(a, b)
        if b == 0 then
            error("에러 발생") -- 불명확한 에러 메시지
        end
    end

    올바른 코드

    -- 올바른 코드
    function divide(a, b)
        if b == 0 then
            error("0으로 나눌 수 없습니다.") -- 명확한 에러 메시지
        end
    end

    6. 정리

    • 에러 처리는 프로그램의 신뢰성과 사용자 경험을 높이는 데 필수적입니다.
    • pcall과 error를 사용하여 안전하게 에러를 처리할 수 있습니다.
    • 명확한 에러 메시지는 문제 해결에 매우 중요합니다.
    • 다음에는 xpcall과 사용자 정의 에러 객체에 대해 학습하는 것을 추천합니다.