예외(Exception)란 무엇인가?
예외(Exception)는 프로그램이 실행되는 도중에 발생하는 문제나 비정상적인 상황을 의미합니다. 프로그램 실행 중에 예외가 발생하면 해당 문장 이후의 코드는 더 이상 실행되지 않으며, PHP는 즉시 첫 번째로 일치하는 catch 블록을 찾아 실행을 시도합니다.
만약 발생한 예외가 어디에서도 처리(포착)되지 않으면, PHP는 "Uncaught Exception"(처리되지 않은 예외)라는 메시지와 함께 치명적 오류(Fatal Error)를 발생시키고 프로그램 실행을 중단합니다.
기본 문법
PHP의 예외 처리는 try, throw, catch, finally 네 가지 요소로 구성됩니다.
try {
print "this is our try block";
throw new Exception();
}catch (Exception $e) {
print "something went wrong, caught yah! n";
}finally {
print "this part is always executed";
}
- try — 예외가 발생할 가능성이 있는 코드를 담는 블록입니다.
- throw — 예외 객체를 생성해 강제로 던지는(발생시키는) 키워드입니다.
- catch — try 블록에서 던져진 예외를 받아 처리하는 블록입니다.
- finally — 예외 발생 여부와 관계없이 항상 마지막에 실행되는 블록입니다.
예제
<?php
function printdata($data) {
try {
// 값이 6일 때만 if문이 실행됩니다.
if($data == 6) {
// 값이 6이면 예외가 발생(throw)합니다.
throw new Exception('Number is six.');
echo "\n After throw (It will never be executed)";
}
}
// try 블록에서 예외가 던져졌을 때 실행됩니다.
catch(Exception $e){
echo "\n Exception Caught", $e->getMessage();
}
// 이 블록의 코드는 항상 실행됩니다.
finally{
echo "\n Final block will be always executed";
}
}
// 여기서는 예외가 발생하지 않습니다.
printdata(0);
// 여기서는 예외가 발생합니다.
printdata(6);
?>
실행 결과
Final block will be always executed Exception CaughtNumber is six. Final block will be always executed
위 결과에서 알 수 있듯이, printdata(0) 호출 시에는 조건이 맞지 않아 예외가 발생하지 않고 finally 블록만 실행됩니다. 반면 printdata(6) 호출 시에는 예외가 발생하여 throw 문 이후의 코드는 건너뛰고 catch 블록이 먼저 실행된 뒤, finally 블록이 마지막에 실행됩니다.
주요 사항
예외를 처리하려면 해당 프로그램 코드가 반드시 try 블록 안에 위치해야 하며, 각각의 try 블록에는 최소 하나 이상의 대응하는 catch 블록이 필요합니다. 또한 서로 다른 종류의 예외 클래스를 각각 처리하기 위해 여러 개의 catch 블록을 나열해서 사용할 수 있습니다.
참고로 PHP 7부터는 기존의 Exception 클래스와 별개로 Error 클래스가 도입되어 TypeError, DivisionByZeroError 같은 내부 오류도 객체 형태로 처리할 수 있게 되었으며, 두 클래스는 모두 Throwable 인터페이스를 구현하고 있습니다.