PHP 5는 다른 프로그래밍 언어와 유사한 예외 모델을 가지고 있습니다. 예외는 throw해서, PHP 안에서 잡을("catch") 수 있습니다. 잠재적인 예외를 쉽게 잡기 위해서 코드를 try 블럭으로 감쌀 수 있습니다. 각 try는 최소한 하나의 해당하는 catch 블럭을 가져야 합니다. 여러 catch 블럭은 각각 다른 예외 클래스를 잡을 수 있습니다. 일반적인 실행(try 블럭에서 예외를 던지지 않거나, 던져진 예외 클래스에 해당하는 catch가 없을 경우)은 마지막 catch 블럭 정의 이후로 진행합니다. 예외는 catch 블럭 안에서 throw할(또는 다시 던질) 수 있습니다.
예외가 던져지면, 따라오는 구문은 실행되지 않고, PHP는 첫번째 해당하는 catch 블럭을 찾습니다. 예외를 잡지 않으면, set_exception_handler()로 핸들러를 정의하지 않는 한, "Uncaught Exception ..." 메세지로 PHP Fatal Error가 발생합니다.
Note: 내부 PHP 함수는 주로 오류 보고를 사용합니다. 최근의 객체 지향 확장만 예외를 사용합니다. 그러나, 오류는 간단히 ErrorException으로 변환할 수 있습니다.
표준 PHP 라이브러리(SPL)는 좋은 내장 예외를 제공합니다.
Example #1 예외 던지기
<?php
function inverse($x) {
if (!$x) {
throw new Exception('Division by zero.');
}
else return 1/$x;
}
try {
echo inverse(5) . "\n";
echo inverse(0) . "\n";
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
// 계속 실행
echo 'Hello World';
?>
위 예제의 출력:
0.2 Caught exception: Division by zero. Hello World
Example #2 중첩 에외
<?php
class MyException extends Exception { }
class Test {
public function testing() {
try {
try {
throw new MyException('foo!');
} catch (MyException $e) {
/* rethrow it */
throw $e;
}
} catch (Exception $e) {
var_dump($e->getMessage());
}
}
}
$foo = new Test;
$foo->testing();
?>
위 예제의 출력:
string(4) "foo!"