R's Hacking Daily Log

php 예외 처리 본문

PHP

php 예외 처리

hanhxx 2023. 7. 19. 14:27

Step 1 :: Exception Class

코딩을 하다 보면 문법 상의 오류나 논리적인 오류로 인해 오류가 발생한 적이 있을 것이다.

문법적인 오류는 비교적 쉽게 발견할 수 있지만 논리적인 오류는 고려하지 못한 경우의 수에 의해 발생할 때가 많아

골치 아플 수있다.

 

이번에 다루어볼 예외 처리란

예상하지 못한 동작으로 인해 발생할 수 있는 오류를 처리하는 걸 의미한다. 

 

프로그램을 만드는 입장에서 고려한 부분이 아닌, 예외적인 경우를 어떻게 처리하면 좋을지에 대한 방안을 알아보자. 

 

 

처음으로 알아볼 예외 처리 방법은 Exception class이다.

이름대로 Exception은 클래스이기 때문에 객체 생성이 가능하다. 

 

Exception class는 기본적으로 내장하는 메서드가 있기 때문에 오류 메시지 & 코드를 매개변수로 전달하여 

지원되는 메서드를 활용할 수 있다.

<?php
$msg = "삐빅- 예외 발생";
$code = 1019;
$e = new Exception($msg, $code);

echo "예외 코드 : {$e->getcode()}<br/>";
echo "예외 메세지 : ".$e->getMessage();

new keyword로 exception class 객체를 하나 만들고 화살표 지정자로 getCode & getMessage 함수를 호출했다.

 

여기서 getCode & getMessage 함수가 Exception class에 내장되어 있는 메서드이기 때문에 

위의 코드에서는 별다른 구현없이 바로 사용한 걸 볼 수 있다.

 

 

실행 결과를 살펴보면

getCode 함수는 $code를 매개변수 삼아 코드 값을 반환하는 함수이고 

getMessage 함수는 $msg를 매개변수 삼아 메시지 값을 반환하는 함수라 유추해 볼 수 있다. 

 

 


Step 2 :: throw

두 번째로 알아볼 예외 처리 방법은 throw이다. 

throw new Exception();

이름대로 예외가 발생한 경우 예외(or 에러)를 던져버린다는 의미이다.

 

 

이해를 돕기 위해 예시를 살펴보자!

$VARIABLE_NAME =  fn() => ($null을 갖는 변수) ?? throw new Exception();

만약 변수가 null값을 가진다면 null 병합 연산자에 의해 throw로 작성된 내용이 실행된다.

 

이처럼 예외로 처리할 경우를 정의해놓고 해당 경우가 발생하게 되면 예외 처리가 이루어지도록 

예외 처리 클래스로 예외(or 에러)를 던져주는 역할을 한다. 

 

 

또는 false가 돼서는 안 되는 변수가 false가 되어버렸을 때

$VARIABLE_NAME = condition ? True인 경우 : throw new Exception();

예외 처리되도록 삼항 연산자를 이용해 위와 같은 구문을 작성할 수도 있다.

 

 


Step 3 :: try - catch

다음으로 try-catch문에 대해 알아보자. try-catch문은 크게 try & catch 문으로 나눠진다. 

 

try 문에서는 실행하고자 하는 코드를 작성하는 데 예상치 못한 에러가 발생할 수 있기 때문에

이를 처리하기 위해 catch 문이 따라붙는 것이다.

 

catch문에는 try문에서 에러가 발생할 경우 예외 처리로 실행할 내용을 작성하면 된다. 

 

즉 작성된 코드를 실행(try)하는 과정에서 에러가 발생하면

이를 딱 잡아내서(catch) 예외 처리로 해결해 주는 관계라고 보면 된다. 

 

<?php
try {
    throw new Exception("예외 던져! 던져!");
} catch (Throwable $e) {
    echo $e->getMessage();
}

try-catch가 동작하는 걸 확인해보기 위해 의도적으로 try문에서 에러를 발생시켰다. (throw keyword 사용)

throw keyword를 사용해 에러를 던졌기 때문에 catch문에서는 이를 감지하고 getMessage 함수를 실행할 것이다.

 

 

이때 catch문 괄호에 작성된 Throwable에 대해 짧게 언급하자면

Throwable은 PHP에서 기본적으로 상속받는 인터페이스로 Throwable 안에 Error & Exception class가 포함되어 있다. 

 

 

그렇기 때문에 Throwable 형 객체 e로 자신이 갖고 있는 Exception class의 getMessage 함수를 호출한 것이라 보면 된다. 

자신이 갖고 있는 함수를 사용한 것이니 에러없이 문구가 정상 출력될 것을 예상할 수 있다.

 

 

[ 결과 확인 ]

 

제어문에서 살펴보았던 if-elseif-else문처럼 try-catch문도 여러 catch문을 작성함으로써

여러 예외를 처리할 수 있다. 

 

한 가지 에러만 발생하는 것이 아니기 때문에 각 에러에 대해 실행하고자 하는 내용을 달리 작성하여 

경우에 따라 세분화된 예외 처리가 가능하다. 

<?php
class MyExceptionA extends Exception {}
class MyExceptionB extends Exception {}
class MyExceptionC extends Exception {}

$num = 2;

try {
    if($num == 9) { throw new MyExceptionA("number is 9");}
    if($num == 2) { throw new MyExceptionB("number is 2");}
    if($num == 7) { throw new MyExceptionC("number is 7");}
} catch (MyExceptionA $e) {
    echo "예외 메세지 : ".$e->getMessage();
} catch (MyExceptionB $e) {
    echo "예외 메세지 : ".$e->getMessage();
} catch (MyExceptionC $e) {
    echo "예외 메세지 : ".$e->getMessage();
}

사용자 정의 예외 처리 클래스를 만들기 위해 Exception Class를 상속받았다.

변수 num 값이 9 OR 2 OR 7일 경우에 따라 각각 다른 예외 처리가 이루어지도록 catch문을 작성한 예시이다.

 

서로 다른 예외 처리를 위해 throw keyword를 사용해 경우에 알맞은 예외 처리 클래스를 생성했음을 눈 여겨보자!

num이 2이기 때문에 두 번째 catch문이 실행될 것을 예상할 수 있다.

 


Step 4 :: finally

마지막으로 살펴볼 finally는 try-catch문 내용의 연장선이라 보면 된다.

 

try-catch문에서는 실행할 내용 & 예외 처리에 대한 내용을 작성했다면

그 후에 처리할 내용을 추가로 정의할 수 있는 부분이 finally 문이다. 

 

에러 발생 유무에 따라

예외 발생 o : try → catch → finally
예외 발생 x : try → finally

코드가 실행되는 흐름이 위와 같이 달라질 수 있는 데 finally문의 실행 여부는

catch문 실행 여부와는 상관없음을 알 수 있다.

 

 

단순히 실행 내용 & 예외 처리만을 구현하겠다면 try-catch문으로 충분하지만 

마지막 부분에 공통적으로 처리할 내용을 추가하고 싶다면 finally문을 활용할 수 있다는 점만 알고 넘어가자!

<?php
try {
    throw new Exception("exception exception");
} catch(Throwable $e) {
    echo $e->getMessage();
} finally {
    echo "finally block";
}

 

'PHP' 카테고리의 다른 글

php Cookie  (0) 2023.07.22
php Session  (0) 2023.07.21
php 객체 지향 프로그램 (6)  (0) 2023.07.18
php 객체 지향 프로그램 (5)  (0) 2023.07.18
php 객체 지향 프로그램 (4)  (0) 2023.07.16
Comments