0Pricing
PHP Academy · 강의

사용자 정의 예외 만들기

Exception 클래스를 확장해 도메인별 오류 유형을 만듭니다.

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

사용자 지정 예외가 필요한 이유

사용자 지정 예외를 사용하면 다음을 할 수 있습니다:

  • 애플리케이션 오류를 일반적인 PHP 오류와 구분
  • 도메인별 데이터 전달(주문 ID, 사용자 ID 등)
  • 여러 계층에서 특정 오류 유형 포착
  • 의미 있고 자체적으로 설명되는 오류 계층 구조 생성

Exception 확장

Exception 기본 클래스를 확장하여 사용자 지정 예외를 만드세요:

<?php
class ValidationException extends \Exception
{
    private array $errors;

    public function __construct(array $errors, string $message = '', int $code = 0)
    {
        $this->errors = $errors;
        parent::__construct($message ?: implode(', ', $errors), $code);
    }

    public function getErrors(): array
    {
        return $this->errors;
    }
}

사용자 지정 예외 사용

사용자 지정 예외를 던지고 포착하세요:

<?php
function createUser(array $data): void {
    $errors = [];
    if (empty($data['email'])) $errors[] = 'Email required';
    if (empty($data['name']))  $errors[] = 'Name required';

    if ($errors) {
        throw new ValidationException($errors);
    }
    // save user...
}

try {
    createUser([]);
} catch (ValidationException $e) {
    foreach ($e->getErrors() as $err) {
        echo '- ' . $err . PHP_EOL;
    }
}

예외 계층 구조 설계

도메인에 맞는 계층 구조를 설계하세요:

<?php
// Base exception for your app
class AppException extends \RuntimeException {}

// Domain-specific exceptions
class NotFoundException extends AppException {}
class AuthException extends AppException {}
class PaymentException extends AppException {}

// Specific payment errors
class InsufficientFundsException extends PaymentException {
    public function __construct(public readonly float $balance, public readonly float $required) {
        parent::__construct("Insufficient funds: have $balance, need $required");
    }
}

계층 구조에 따른 예외 포착

모든 파생 예외를 처리하려면 기본 클래스를 포착하세요:

<?php
try {
    processPayment($order);
} catch (InsufficientFundsException $e) {
    echo 'Low balance: need ' . $e->required;
} catch (PaymentException $e) {
    echo 'Payment failed: ' . $e->getMessage();
} catch (AppException $e) {
    echo 'App error: ' . $e->getMessage();
} catch (\Throwable $e) {
    // Last resort
    error_log($e);
}

예외에 컨텍스트 추가

디버깅을 위한 추가 데이터로 예외를 보강하세요:

<?php
class HttpException extends \RuntimeException
{
    public function __construct(
        private int    $statusCode,
        string         $message = '',
        ?\Throwable    $previous = null
    ) {
        parent::__construct($message, $statusCode, $previous);
    }

    public function getStatusCode(): int
    {
        return $this->statusCode;
    }
}

HTTP 예외 예시

웹 애플리케이션에서 HTTP 예외를 사용하는 방법:

<?php
try {
    $user = findUserById($id);
    if (!$user) throw new HttpException(404, 'User not found');
    if (!$user->canAccess($resource)) {
        throw new HttpException(403, 'Access denied');
    }
} catch (HttpException $e) {
    http_response_code($e->getStatusCode());
    echo json_encode(['error' => $e->getMessage()]);
}

인터페이스 기반 예외

서로 관련 없는 예외 클래스를 그룹화하려면 인터페이스를 사용하세요:

<?php
interface UserFacingException
{
    public function getUserMessage(): string;
}

class ValidationException extends \Exception implements UserFacingException
{
    public function getUserMessage(): string
    {
        return 'Please check your input: ' . $this->getMessage();
    }
}

// In controller:
catch (UserFacingException $e) {
    echo $e->getUserMessage();
}

명명된 생성자 패턴

일반적인 예외 상황에는 정적 팩터리 메서드를 사용하세요:

<?php
class OrderException extends \RuntimeException
{
    public static function notFound(int $id): self
    {
        return new self("Order #$id not found", 404);
    }

    public static function alreadyShipped(int $id): self
    {
        return new self("Order #$id already shipped", 409);
    }
}

throw OrderException::notFound($orderId);

예외 직렬화

로그 기록 또는 API 응답을 위해 예외 데이터를 배열로 변환하세요:

<?php
function exceptionToArray(\Throwable $e): array {
    return [
        'type'    => get_class($e),
        'message' => $e->getMessage(),
        'code'    => $e->getCode(),
        'file'    => $e->getFile(),
        'line'    => $e->getLine(),
        'trace'   => $e->getTraceAsString(),
        'previous' => $e->getPrevious()
            ? exceptionToArray($e->getPrevious())
            : null,
    ];
}

사용자 지정 예외 설계 지침

사용자 지정 예외를 설계하기 위한 지침:

  • 예상하지 못한 상황에는 RuntimeException 확장
  • 프로그래머 오류(잘못된 인수)에는 LogicException 확장
  • 가능한 모든 메시지마다 예외 클래스를 만들지 말고 코드 사용
  • 예외 클래스 이름은 PascalCase를 사용하고 Exception으로 끝내기
  • 각 메서드가 던질 수 있는 예외를 문서화

빠른 확인

코드에서 논리적 오류를 나타내는 사용자 지정 예외를 만들려면 어떤 PHP 기본 클래스를 확장해야 합니까?

복습: 사용자 지정 예외

사용자 지정 예외 요약:

  • Exception 또는 그 하위 클래스를 확장
  • 도메인별 속성과 메서드 추가
  • 계층 구조를 설계하고 부모를 포착하여 모든 자식 포착
  • 서로 관련 없는 예외를 그룹화하려면 인터페이스 사용
  • 명확성을 위해 정적 명명 생성자 사용
  • 항상 parent::__construct() 호출

자주 묻는 질문

“사용자 정의 예외 만들기” 강의는 무료인가요?

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

“사용자 정의 예외 만들기”에서 뭘 배우나요?

Exception 클래스를 확장해 도메인별 오류 유형을 만듭니다. 브라우저에서 직접 실행하는 실습 코드로 PHP Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

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

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

“사용자 정의 예외 만들기” 강의는 얼마나 걸리나요?

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

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

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

이 강의의 모든 강의

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