여러분이 사용하고 계신 브라우저는 HTML5를 지원하지 않기 때문에 몇몇 요소가 제대로 보이도록 JScript를 사용하고 있습니다. 하지만 여러분의 브라우저 설정에서 스크립트 기능이 꺼져있으므로, 현재 페이지를 제대로 확인하시려면 스크립트 기능을 켜주셔야 합니다. PHP - 기초 - 예외
PHP – 기초 – 예외
2년전 작성
1년전 수정

예외란 ?

예외는 PHP 스크립트의 오류 또는 예기치 않은 동작을 설명하는 개체다.

예외는 많은 PHP 함수들과 클래스들에 의해 던져진다.

사용자 정의 함수 및 클래스도 예외를 발생시킬 수 있다.

예외는 사용할 수 없는 데이터가 있을 때 함수를 중지하는 좋은 방법이다.

예외 발생

throw 문을 사용하면 사용자 정의 함수 또는 메서드가 예외를 발생시킬 수 있다.
예외가 발생해도 이후의 코드는 실행되지 않는다.

예외 잡지 않고 throw

예외가 감지되지 않으면 “Uncatched Exception” 메시지와 함께 치명적인 오류가 발생한다.

PHP
<!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>
기본 예시
Fatal error: Uncaught Exception: Division by zero in C:\webfolder\test.php:4
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
<?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
<?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
<?php

?>
기본 예시
프로세스 완료.

예외 개체

예외 개체에는 함수에서 발생한 오류 또는 예기치 않은 동작에 대한 정보가 들어 있다.

new Exception(message, code, previous);

이런식으로 입력한다.

매개 변수
message
:
선택 사항. 예외가 느려진 이유를 설명하는 문자열.
code
:
선택 사항. 이 예외를 같은 유형의 다른 예외와 쉽게 구분하는 데 사용할 수 있는 정수.
previous
:
선택 사항. 이 예외가 다른 예외의 캐치 블록에 있는 경우 해당 예외를 이 매개 변수로 전달하는 것이 좋다.

예외 포착 방법

예외를 포착할 때 다음 표에서는 예외에 대한 정보를 가져오는 데 사용할 수 있는 몇 가지 메서드를 보여준다.

메서드
getMessage()
:
예외가 발생한 이유를 설명하는 문자열을 반환한다.
getPrevious()
:
이 예외가 다른 예외에 의해 트리거된 경우 이 메서드는 이전 예외를 반환한다. 그렇지 않으면 null을 반환한다.
getCode()
:
예외 코드를 반환한다.
getFile()
:
예외가 발생한 파일의 전체 경로를 반환한다.
getLine()
:
예외를 발생시킨 코드 줄의 줄 번호를 반환한다.

발생한 예외에 대한 출력

PHP
<!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>

기본 예시
8 라인에서 /home/Jfr9f6/prog.php 에 예외가 발생함 [Code 1] 0으로 나누기.

참고

Mingg`s Diary
밍구
밍구
공부 목적 블로그