PHP - 예외
Throwables 인터페이스
PHP에서 예외는 특정 오류가 코드에서 발생할 때 던져지는 객체입니다. PHP는 Throwable
인터페이스를 제공하며, 이는 모든 예외와 오류의 기본 클래스입니다. 이 인터페이스는 예외를 효과적으로 처리할 수 있도록 여러 메서드를 제공합니다.
기본 예외 처리
PHP에서 예외를 처리하려면 try-catch
블록을 사용할 수 있습니다. 다음은 예제입니다:
<?php
try {
// 예외를 던질 수 있는 코드
throw new Exception("오류가 발생했습니다!");
} catch (Exception $e) {
// 예외를 처리하는 코드
echo "예외를 catch 했습니다: " . $e->getMessage();
}
?>
이 예제에서 우리는 throw
문을 사용하여 새로운 Exception
객체를 만들고 커스텀 메시지를 설정합니다. try
블록 내에서 예외가 던져진다면, 코드 실행은 해당 catch
블록으로 이동하며, 예외가 catch되고 처리됩니다.
set_exception_handler
set_exception_handler
함수는 잡히지 않은 예외가 던져질 때 호출될 커스텀 함수를 정의할 수 있게 해줍니다. 이 함수는 예외 객체와 eval()
호출 중에 예외가 던져졌는지를 나타내는 불리언 값을 두 개의 매개변수로 받아야 합니다.
다음은 set_exception_handler
를 사용하는 예제입니다:
<?php
function myExceptionHandler($exception) {
echo "잡히지 않은 예외: " . $exception->getMessage();
}
set_exception_handler('myExceptionHandler');
// 예외를 던지는 코드
throw new Exception("아이고! 무언가 잘못되었습니다.");
?>
이 예제에서 우리는 myExceptionHandler
라는 커스텀 예외 처리 함수를 정의하고, set_exception_handler
를 사용하여 이 함수를 기본 예외 처리기로 설정합니다. 잡히지 않은 예외가 던져질 때, 우리의 커스텀 함수가 기본 처리기 대신 호출됩니다.
SPL 예외
PHP는 표준 PHP 라이브러리(SPL)에서 여러 가지 내장 예외 클래스를 제공합니다. 이 클래스들은 Exception
클래스를 확장하고, 다양한 유형의 예외에 대해 더 구체적인 정보를 제공합니다. 일반적인 SPL 예외 클래스는 다음과 같습니다:
-
BadFunctionCallException
: 정의되지 않은 함수를 참조하거나 일부 인자가 누락될 때 던집니다. -
DomainException
: 애플리케이션의 도메인 논리에서 오류가 발생했을 때 사용됩니다. -
InvalidArgumentException
: 함수에 잘못된 인자가 전달되었을 때 발생합니다. -
LengthException
: 잘못된 길이의 객체를 사용하려는 시도에서 사용됩니다. -
OutOfBoundsException
: 배열 인덱스가 범위를 벗어났을 때 던집니다. -
OutOfRangeException
: 값이 기대 범위에 없을 때 발생합니다. -
RangeException
: 값이 지정된 범위에 없을 때 사용됩니다. -
RuntimeException
: 런타임 오류에 대한 일반 목적 예외입니다. -
UnderflowException
: 언더플로우가 발생했을 때 던집니다 (예: 빈 스택에서 빼는 경우). -
UnexpectedValueException
: 값이 기대된 유형과 일치하지 않을 때 발생합니다.
이 SPL 예외를 코드에서 사용할 수 있습니다. 예를 들어:
<?php
function divide($a, $b) {
if ($b == 0) {
throw new DivisionByZeroError("0으로 나눌 수 없습니다.");
}
return $a / $b;
}
try {
echo divide(10, 0);
} catch (DivisionByZeroError $e) {
echo "예외를 catch 했습니다: " . $e->getMessage();
}
?>
사용자 정의 예외
내장된 SPL 예외 외에도 커스텀 예외 클래스를 생성할 수 있습니다. 이를 위해 Exception
클래스를 확장하고 필요한 기능을 추가하면 됩니다. 다음은 예제입니다:
<?php
class MyCustomException extends Exception {
public function __construct($message, $code = 0, Exception $previous = null) {
parent::__construct($message, $code, $previous);
}
}
try {
throw new MyCustomException("이는 커스텀 예외입니다.");
} catch (MyCustomException $e) {
echo "커스텀 예외를 catch 했습니다: " . $e->getMessage();
}
?>
이 예제에서 우리는 MyCustomException
이라는 새로운 클래스를 생성하고 Exception
클래스를 확장합니다. 그런 다음 커스텀 예외를 던지고 catch하는 방식과 다른 예외와 동일하게 처리합니다.
이 가이드를 따르고 제공된 도구를 사용하면 PHP 코드에서 예외를 효과적으로 처리하고, 예상치 못한 오류에 대한 애플리케이션의 견고성과 탄력성을 보장할 수 있습니다. 항상 코드를 철저히 테스트하고 예외를 부드럽게 처리하여 사용자 경험을 향상시키는 것이 중요합니다.
Credits: Image by storyset