[PHP] 예외처리(try ~ catch ~ finally)


Study/PHP  2019. 9. 11. 23:41

안녕하세요. 명월입니다.


이 글은 PHP에서 사용되는 예외처리(try ~ catch ~ finally)에 대해서 설명하겠습니다.


예외처리는 따로 PHP라고 해서 특별한 것은 없습니다. 다른 Java나 C#과 비슷한 로직으로 돌아갑니다.

링크 - https://www.php.net/manual/en/language.exceptions.php


예외처리는 프로그램 상에서 예외를 발생시키는 경우가 있는데 그럴 경우 사용하는 것이빈다.

링크 - [C# 강좌 - 21] 예외 처리

링크 - [Java강좌 - 18] 예외 처리

<?php
  $title = "title";
  function example() {
    throw new Exception('Exception!!!');
  }
  $errorMessage = "";
  $check = 0;
  try{
    example();
    // check 값을 1 증가시킨다.
    $check += 1;
  } catch(Exception $e){
    $errorMessage = $e;
  } finally {
    // check 값을 1 증가시킨다.
    $check += 1;
  }
  
?>
<!DOCTYPE html>
<html>
<head>
  <title>
    <?=$title?>
  </title>
</head>
<body>
  <?=$errorMessage?>
  <br />
  <?=$check?>
</body>
</html>

위 소스에서 example함수는 호출되면 throw로 Exception을 던집니다. 다시 메인 으로 돌아와서 try ~ catch ~ finally 구문에서 try의 안에는 example 함수를 호출합니다.

example함수에서는 throw로 Exception을 던지기 때문에 catch로 넘어가고 $errorMessage라는 변수에 에러 내용을 넣습니다.

최종적으로 try ~ catch에서 에러 발생 여부와 관계없이 finally가 호출되는데 $check값을 1 증가 시키네요.


결과는 에러메시지와 $check값의 1이 나온것을 확인할 수 있습니다.

여기서 포인트는 try 구문에도 check값을 1 증가시키는 구문이 있습니다만, example에서 Exception이 발생하므로 check가 1 증가하는 것은 실행되지 않습니다.


기본적으로 throw 던지면 try ~ catch에서 받습니다만, Exception 클래스를 상속받아서 catch의 종류 별로 에러를 다르게 할 수도 있습니다.

<?php
  // Exception을 상속받는다.
  class MyException1 extends Exception { }
  class MyException2 extends Exception { }

  $title = "title";
  function example($type) {
    if($type == 1){
      throw new MyException1('MyException1!!!');
    }
    if($type == 2){
      throw new MyException2('MyException2!!!');
    }
    throw new Exception('Exception!!!');
  }
  $errorMessage = "";
  $check = 0;
  try{
    // MyException1를 발생 유도한다.
    example(1);
    $check += 1;
  } catch(MyException1 $e){
    $errorMessage = $e;
    $check = 100;
  } catch(MyException2 $e){
    $errorMessage = $e;
    $check = 1000;
  } catch(Exception $e){
    $errorMessage = $e;
  } finally {
    $check += 1;
  }
?>
<!DOCTYPE html>
<html>
<head>
  <title>
    <?=$title?>
  </title>
</head>
<body>
  <?=$errorMessage?>
  <br />
  <?=$check?>
</body>
</html>

example 함수에 1이라는 값을 넣어서 MyException1를 발생시켰습니다.

catch에서는 MyException1, MyException2, Exception를 예외를 설정하고 결과를 보면 check값이 101이 되었기 때문에 MyException1의 구문이 실행된 것을 확인할 수 있습니다.

참고로 MyException1를 발생시켰지만 catch에서 MyException1가 없으면 Exception으로 실행됩니다.


여기까지 PHP의 예외처리(try ~ catch ~ finally)에 대한 설명이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.