0Pricing
PHP Academy · 강의

Try, Catch, Finally

try/catch/finally 블록으로 실행 중 발생하는 예외를 우아하게 처리합니다.

Try, Catch, Finally은(는) CoddyKit의 무료 PHP Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 PHP Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. PHP Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

예외와 오류 비교

PHP에는 문제를 알리는 두 가지 방법이 있습니다:

  • 오류 — 이전 강의에서 다룬 전통적인 PHP 알림/경고/치명적 오류
  • 예외 — 예외적인 상황이 발생했을 때 던지는 객체이며 try/catch로 포착

예외는 복구 가능한 오류를 처리할 때 더 현대적이고 권장되는 방식입니다.

예외 던지기

다음과 같이 throw를 사용하여 문제가 발생했음을 알립니다:

<?php
function divide(float $a, float $b): float {
    if ($b == 0) {
        throw new InvalidArgumentException('Cannot divide by zero');
    }
    return $a / $b;
}

echo divide(10, 2);   // 5
// divide(10, 0);     // throws exception

try / catch 블록

예외를 발생시킬 수 있는 코드를 try로 감싸고 catch에서 예외를 처리하세요:

<?php
try {
    $result = divide(10, 0);
    echo $result;
} catch (InvalidArgumentException $e) {
    echo 'Error: ' . $e->getMessage();
    echo ' in ' . $e->getFile() . ':' . $e->getLine();
}

여러 catch 블록

각기 다른 예외 유형을 별도의 catch 블록에서 포착하세요:

<?php
try {
    $pdo = new PDO($dsn, $user, $pass);
    $result = performQuery($pdo);
} catch (PDOException $e) {
    error_log('DB error: ' . $e->getMessage());
    echo 'Database unavailable';
} catch (RuntimeException $e) {
    echo 'Runtime error: ' . $e->getMessage();
} catch (\Throwable $e) {
    echo 'Unexpected error: ' . $e->getMessage();
}

finally 블록

예외가 던져졌는지와 관계없이 finally는 실행되므로 정리 작업에 적합합니다:

<?php
$connection = null;
try {
    $connection = openDatabaseConnection();
    $data = fetchData($connection);
} catch (DatabaseException $e) {
    error_log($e->getMessage());
    echo 'DB error';
} finally {
    // Always runs — even if exception was thrown
    if ($connection) {
        closeConnection($connection);
    }
}

예외 계층 구조

PHP의 예외 클래스 계층 구조:

  • Throwable(인터페이스)
  • ├─ Error — PHP 엔진 오류(TypeError, ParseError…)
  • └─ Exception — 애플리케이션 예외
  • ├─ RuntimeException
  • ├─ InvalidArgumentException
  • ├─ LogicException
  • └─ PDOException

Throwable 포착

Throwable을 사용하여 예외와 PHP 오류를 모두 포착하세요:

<?php
try {
    $result = someFunction();
} catch (\Exception $e) {
    echo 'Exception: ' . $e->getMessage();
} catch (\Error $e) {
    echo 'PHP Error: ' . $e->getMessage();
}

// Or catch both at once:
try {
    // ...
} catch (\Throwable $e) {
    echo get_class($e) . ': ' . $e->getMessage();
}

유니온 예외 포착(PHP 8)

PHP 8에서는 하나의 catch 블록에서 여러 예외 유형을 포착할 수 있습니다:

<?php
try {
    processRequest();
} catch (InvalidArgumentException | RuntimeException $e) {
    echo 'Handled: ' . $e->getMessage();
}

// Compare PHP 7 approach:
// catch (InvalidArgumentException $e) { ... }
// catch (RuntimeException $e) { ... }

예외 다시 던지기

예외를 포착하고 기록한 다음 다시 던져 호출 스택 위로 전달하세요:

<?php
function processOrder(int $id): void {
    try {
        $order = loadOrder($id);
        $order->process();
    } catch (PaymentException $e) {
        error_log('Payment failed for order ' . $id . ': ' . $e->getMessage());
        throw $e;  // re-throw after logging
    }
}

예외 연결

컨텍스트를 유지하려면 원래 예외를 이전 예외로 전달하세요:

<?php
try {
    $data = fetchFromAPI();
} catch (NetworkException $e) {
    throw new ServiceUnavailableException(
        'Cannot reach upstream service',
        0,
        $e  // $previous — preserves original cause
    );
}

// Retrieve original:
// $e->getPrevious()

set_exception_handler

전역에서 포착되지 않은 예외 처리기를 등록하세요:

<?php
set_exception_handler(function(\Throwable $e): void {
    error_log(sprintf(
        '[UNCAUGHT] %s: %s in %s:%d',
        get_class($e),
        $e->getMessage(),
        $e->getFile(),
        $e->getLine()
    ));
    http_response_code(500);
    echo 'An unexpected error occurred. Please try again.';
    exit(1);
});

빠른 확인

예외가 던져지는지와 관계없이 반드시 실행되는 try/catch/finally 블록은 무엇입니까?

복습: try/catch/finally

예외 처리 요약:

  • throw new ExceptionClass()로 예외 던지기
  • catch (Type $e)로 포착
  • 서로 다른 유형에는 여러 catch 블록 사용
  • finally는 항상 실행되므로 정리 작업에 사용
  • PHP 8 유니온 catch: catch (A | B $e)
  • 호출 스택 컨텍스트를 유지하려면 예외를 다시 던지기

자주 묻는 질문

“Try, Catch, Finally” 강의는 무료인가요?

네 — “Try, Catch, Finally” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 PHP Academy 강의 전체를 잠금 해제할 수 있습니다. PHP Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“Try, Catch, Finally”에서 뭘 배우나요?

try/catch/finally 블록으로 실행 중 발생하는 예외를 우아하게 처리합니다. 브라우저에서 직접 실행하는 실습 코드로 PHP Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

PHP Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 PHP Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“Try, Catch, Finally” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 PHP Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 PHP Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. PHP 오류 유형 및 보고
  2. Try, Catch, Finally
  3. 사용자 정의 예외 만들기
  4. 오류 로깅 및 모범 사례
← PHP Academy(으)로 돌아가기