예외란 ?
예외는 PHP 스크립트의 오류 또는 예기치 않은 동작을 설명하는 개체다.
예외는 많은 PHP 함수들과 클래스들에 의해 던져진다.
사용자 정의 함수 및 클래스도 예외를 발생시킬 수 있다.
예외는 사용할 수 없는 데이터가 있을 때 함수를 중지하는 좋은 방법이다.
예외 발생
throw 문을 사용하면 사용자 정의 함수 또는 메서드가 예외를 발생시킬 수 있다.
예외가 발생해도 이후의 코드는 실행되지 않는다.
예외 잡지 않고 throw
예외가 감지되지 않으면 “Uncatched Exception” 메시지와 함께 치명적인 오류가 발생한다.
<!DOCTYPE html> <html> <body> <?php function divide($dividend, $divisor) { if($divisor == 0) { throw new Exception("Division by zero"); } return $dividend / $divisor; } echo divide(5, 0); ?> </body> </html>
Stack trace: #0 C:\webfolder\test.php(9):
divide(5, 0) #1 {main} thrown in C:\webfolder\test.php on line 4
try…catch
예외 잡지 않고 throw시 발생되는 문제를 해결하기위해 try…catch 문을 사용할 수 있다.
try { 예외를 발생시킬 수 있는 코드 } catch(Exception $e) { 예외가 발견될 때 실행되는 코드 }
이런식으로 입력한다.
예외가 발생하면 메시지를 표시한다.
<?php function divide($dividend, $divisor) { if($divisor == 0) { throw new Exception("0으로 나누기."); } return $dividend / $divisor; } try { echo divide(5, 0); } catch(Exception $e) { echo "나눌 수 없음."; } ?>
catch 블록은 잡아야 할 예외 유형과 예외에 액세스하는 데 사용할 수 있는 변수의 이름을 나타낸다.
위의 예에서 예외 유형은 Exception이며 변수 이름은 $e다.
try…catch…finally
try…catch…finally 명령문은 예외를 잡는 데 사용할 수 있다.
블록의 finally 코드는 예외가 발견되었는지 여부에 관계없이 항상 실행된다.
finally 문이 존재하는 경우 catch 블록은 선택 사항이다.
try { 예외를 발생시킬 수 있는 코드 } catch(Exception $e) { 예외가 발견될 때 실행되는 코드 } finally { 예외 발생 여부에 관계없이 항상 실행되는 코드 }
이런식으로 입력한다.
예외가 throw되면 메시지를 표시한 다음 프로세스가 종료되었음을 나타내는 방법
<?php function divide($dividend, $divisor) { if($divisor == 0) { throw new Exception("0으로 나누기."); } return $dividend / $divisor; } try { echo divide(5, 0); } catch(Exception $e) { echo "나눌 수 없음. "; } finally { echo "프로세스 완료."; } ?>
예외가 잡히지 않은 경우에도 문자열을 출력하는 방법
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception(“0으로 나누기.”);
}
return $dividend / $divisor;
}
try {
echo divide(5, 0);
} finally {
echo ‘프로세스 완료.’;
}
<?php ?>
예외 개체
예외 개체에는 함수에서 발생한 오류 또는 예기치 않은 동작에 대한 정보가 들어 있다.
new Exception(message, code, previous);
이런식으로 입력한다.
예외 포착 방법
예외를 포착할 때 다음 표에서는 예외에 대한 정보를 가져오는 데 사용할 수 있는 몇 가지 메서드를 보여준다.
발생한 예외에 대한 출력
<!DOCTYPE html> <html> <body> <?php function divide($dividend, $divisor) { if($divisor == 0) { throw new Exception("0으로 나누기.", 1); } return $dividend / $divisor; } try { echo divide(5, 0); } catch(Exception $ex) { $code = $ex->getCode(); $message = $ex->getMessage(); $file = $ex->getFile(); $line = $ex->getLine(); echo "$line 라인에서 $file 에 예외가 발생함 [Code $code] $message"; } ?> </body> </html>