update : 2015.11.03
php.shukuma.com

검색:
 
 
예외

예외

Table of Contents

PHP 5는 다른 프로그래밍 언어와 유사한 예외 모델을 가지고 있습니다. 예외를 throw해서, PHP 안에서 잡을(catch) 수 있습니다. 잠재적인 예외를 잡기 위해서 코드를 try 블록으로 감쌀 수 있습니다. 각 try는 최소한 하나의 catchfinally 블록을 가져야 합니다.

던지는 객체는 반드시 Exception 클래스나 Exception의 자식 클래스이여야 합니다. 다른 객체를 던질 경우 PHP Fatal 오류를 발생합니다.

catch

여러 catch 블록이 각각 다른 예외 클래스를 잡을 수 있습니다. 일반적인 실행(try 블록에서 예외를 던지지 않거나, 던져진 예외 클래스에 해당하는 catch가 존재하지 않을 경우)에서는 마지막 catch 블록 정의 이후로 진행합니다. 예외는 catch 블록 안에서 (다시) throw할 수 있습니다.

예외가 던져지면, 따라오는 구문은 실행되지 않고, PHP는 해당하는 첫번째 catch 블록을 찾습니다. 예외가 잡히지 않으면, "Uncaught Exception ..." 메세지로 PHP Fatal Error가 발생합니다. set_exception_handler()로 핸들러를 정의하여 해당 오류를 처리할 수 있습니다.

finally

PHP 5.5 이후 부터 catch 블록 이후 또는 대신하여 finally 블록을 지정할 수 있습니다. finally 블록은 예외 발생 유무와 관계 없이 trycatch 블록 이후에 항상 실행됩니다.

주의

Note:

내부 PHP 함수는 주로 오류 보고를 사용합니다. 최근의 객체 지향 확장만이 예외를 사용합니다. 그러나, 오류는 ErrorException을 사용하여 간단히 예외로 변환할 수 있습니다.

Tip

표준 PHP 라이브러리(SPL)는 여러 가지 내장 예외를 제공합니다.

예제

Example #3 예외 던지기

<?php
function inverse($x) {
    if (!
$x) {
        throw new 
Exception('Division by zero.');
    }
    return 
1/$x;
}

try {
    echo 
inverse(5) . "\n";
    echo 
inverse(0) . "\n";
} catch (
Exception $e) {
    echo 
'Caught exception: ',  $e->getMessage(), "\n";
}

// 계속 실행
echo "Hello World\n";
?>

위 예제의 출력:

0.2
Caught exception: Division by zero.
Hello World

Example #4 finally 블록과 예외 다루기

<?php
function inverse($x) {
    if (!
$x) {
        throw new 
Exception('Division by zero.');
    }
    return 
1/$x;
}

try {
    echo 
inverse(5) . "\n";
} catch (
Exception $e) {
    echo 
'Caught exception: ',  $e->getMessage(), "\n";
finally {
    echo 
"First finally.\n";
}

try {
    echo 
inverse(0) . "\n";
} catch (
Exception $e) {
    echo 
'Caught exception: ',  $e->getMessage(), "\n";
finally {
    echo 
"Second finally.\n";
}

// 계속 실행
echo "Hello World\n";
?>

위 예제의 출력:

0.2
First finally.
Caught exception: Division by zero.
Second finally.
Hello World

Example #5 중첩 예외

<?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!"