try {
throw new Exception('Message');
} catch(Exception $e) {
echo $e->getMessage();
} finally {
echo ' finally';
}
Message finally
가 출력된다.set_error_handler()
로 에러를 관리할 수 있고set_exception_handler()
로 예외를 관리할 수 있다.set_error_handler(function ($errno, $errstr) {
echo $errno . ' ' . $errstr . "\n";
});
echo $foo;
10/0;
8 Undefined variable: foo
와 2 Division by zero
가 출력된다.set_error_handler(function ($errno, $errstr) {
throw new ErrorException($errstr, $errno);
});
set_exception_handler(function (Exception $e) {
echo 'caughted exception message: ' . $e->getMessage();
});
echo $foo;
위 코드의 출력은 caughted exception message: Undefined variable: foo
다.
하지만 아래 코드의 경우를 보자.
아래 코드는 정의 하지 않은 class Foo
를 부른다.
set_error_handler(function ($errno, $errstr) {
echo $errno . ' ' . $errstr . "\n";
});
new Foo();
PHP Fatal error: Uncaught Error: Class 'Foo' not found in /Users/hyeonseopjeong/Desktop/php/exercise/8. Exception/exception_2.3.php:7
Stack trace:
#0 {main}
thrown in /Users/hyeonseopjeong/Desktop/php/exercise/8. Exception/exception_2.3.php on line 7
set_error_handler()
로 핸들링하지 못하는 것을 알 수 있다.try {
new Foo();
} catch(Error $e) {
echo $e->getMessage();
}
Error
class로 catch를 해주면 try구문에서 일어나는 fatal error를 포함한 모든 error를 잡을 수 있다.Error
는 ErrorException
과 다름에 유의하자!Throwable
이라는 인터페이스를 상속하고 있어서, try catch 구문에서 사용가능한 것이다.class MyException extends Exception
{
}
try {
throw new MyException('Message');
} catch (MyException $e) {
echo 'This is MyException';
} catch(Exception $e) {
echo 'This is Exception';
}
This is MyException
을 출력한다.Exception
으로 catch할 수도 있지만 MyException
클래스에서 먼저 catch 되었기 때문이다.Throwable
인터페이스를 직접 상속받는 것 보다 Exception
클래스를 상속 받아서 예외 클래스를 만드는 것이 더 권장된다.
6강 까지 정말 잘 보았습니다.
잘 정리하셨고 많은 도움을 받았습니다.
JAVA로 OOP 공부했는데 PHP는 다른 부분이 많은 것 같습니다.
정말 감사합니다. ^^