PHP에서 오류(Error)와 예외(Exception)는 비슷해 보이지만 성격과 처리 방식이 완전히 다릅니다. 두 개념의 주요 차이점을 항목별로 살펴보겠습니다.
- 복구 가능 여부: 오류는 복구가 불가능하며, 유일한 해결책은 프로그램 실행을 종료하는 것입니다. 반면 예외는 try-catch 블록으로 처리하거나 호출자에게 다시 던지는(throw) 방식으로 복구할 수 있습니다.
- 처리 방식: 오류는 try-catch 블록으로 처리할 수 없습니다. 설령 처리하려 해도 오류가 발생한 시점에 애플리케이션은 정상적으로 복구되지 않습니다. 반면 예외는 try-catch 블록으로 처리할 수 있으며, 문제가 발생해도 프로그램 흐름을 계속 정상적으로 이어갈 수 있습니다.
- 발생 원인: 예외는 주로 애플리케이션 내부의 로직과 관련이 있는 반면, 오류는 애플리케이션이 실행되는 환경 자체와 관련이 있습니다.
예외 처리 예제
<?php
try {
$row->insert();
$inserted = true;
}
catch (Exception $e)
{
echo "행 삽입 중 오류가 발생했습니다 - ".$e->getMessage();
$inserted = false;
}
echo "추가 작업 계속";
?>
코드 설명
위 코드에서 예외를 '잡아냈기(catch) 때문에' 프로그램 실행은 중단되지 않고 계속 진행됩니다. 예외는 catch로 처리하지 않으면 일반적인 오류처럼 동작하여 실행을 멈추게 됩니다. 즉, 예외를 적절히 처리하면 특정 작업이 실패한 이후에도 나머지 프로그램을 정상적으로 실행할 수 있습니다.
오류 발생 예제
<?php
$foo = [bar];
echo $foo;
?>
코드 설명
위 코드는 배열을 문자열로 변환하려고 시도하다가 PHP Notice: Array to string conversion 알림과 함께 실행이 중단됩니다. 이러한 상황은 try-catch 블록으로 잡아낼 수 없으며, 코드 자체를 올바르게 수정해야만 해결됩니다.
참고: PHP 7 이후의 변화
PHP 7부터는 내부 오류 대부분이 Error 클래스로 재구성되었고, Exception과 마찬가지로 Throwable 인터페이스를 구현합니다. 따라서 TypeError, DivisionByZeroError 같은 일부 오류도 try-catch로 감지할 수 있게 되었습니다. 다만 치명적(fatal) 오류는 여전히 복구할 수 없으므로, 근본적으로는 오류를 사전에 방지하는 코드를 작성하는 것이 가장 안전한 접근 방식입니다.