본문 바로가기
프로그래밍/Web

PHP 7 에서의 예외처리 - Throwable, Exception, Error

by 사악신 2017. 4. 21.


PHP 의 경우 Error 와 Exception 을 구분합니다.


PHP 7 에서는 Error 중 E_ERROR, E_RECOVERABLE_ERROR 의 경우 Exception 처럼 사용(try, catch, finally)이 가능합니다.(그 외 Error 는 기존의 방식과 동일합니다.) 하지만, Exception 처럼 사용이 가능하다고 Exception 클래스를 상속받은 것은 아닙니다. 별도의 Error 클래스를 상속받았지요.


다만, Exception 과 Error 클래스는 모두 Throwable 인터페이스를 상속하여 구현되었습니다.


Throwable {

  abstract public string getMessage ( void )

  abstract public int getCode ( void )

  abstract public string getFile ( void )

  abstract public int getLine ( void )

  abstract public array getTrace ( void )

  abstract public string getTraceAsString ( void )

  abstract public Throwable getPrevious ( void )

  abstract public string __toString ( void )

}


PHP 5 에서 모든 예외에 대한 catch 처리는 다음과 같습니다.


try {


} catch (Exception $e) {


}


PHP 7 에서는 E_ERROR 와 E_RECOVERABLE_ERROR 의 경우도 가능하므로...


try {


} catch (Exception $e) {


} catch (Error $e) {


}


이 둘을 합친다면...(PHP 7 이상 에서만 가능합니다)


try {


} catch (Throwable $t) {


}


PHP 5, PHP 7 모두 사용이 가능한 코드는 다음과 같습니다.


try {


} catch (Throwable $t) {

  // PHP 5 에서는 실행되지 않습니다.

  // PHP 7 에서는 실행됩니다.

} catch (Exception $e) {

  // PHP 5 에서는 실행됩니다.

  // PHP 7 에서는 여기까지 도달하지 않습니다.

}


물론, 전역 Error 처리기를 사용하여 PHP 5 에서도 Error 를 Exception 으로 처리가능합니다.


<?php

  set_error_handler(function ($errno, $errstr, $errfile, $errline) {

    if(!(error_reporting() & $errno)) {

      return;

    }


    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);

  });




  restore_error_handler();



error_reporting 설정은 php.ini 에서 합니다. 여기서 ErrorException 은 Exception 클래스의 자손입니다. 다만, 상기의 경우 E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING과 E_STRICT 오류 등은 불가능합니다.

반응형

댓글