사용자 정의 예외 만들기
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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- PHP 오류 유형 및 보고
- Try, Catch, Finally
- 사용자 정의 예외 만들기
- 오류 로깅 및 모범 사례