
코드가 정상적으로 동작하지만 예외적인 상황으로 코드가 동작하지 않을 경우에 예외 객체가 생성될 수 있다.
예외 객체exception object가 생성되면 PHP 인터프리터는 페이지 실행을 중지하고 예외 상황을 처리하기 위한 코드를 찾는다. 이것은 문제를 복구할 수 있는 기회를 프로그램에 준다.
만약에 그 상황을 처리할 코드를 찾으면 해당 코드를 실행한 다음에 예외를 발생시킨 구문 이후의 코드를 계속 실행한다.
만약에 그 상황을 처리할 코드를 발견하지 못하면 Uncaught exception 메시지로 시작하는 치명적인 오류가 발생하고 페이지 실행을 중지한다.
프로그래머는 예외가 던져졌고thrown 예외가 처리하는 코드가 예외를 캐치했다catch고 말한다.
예외 객체의 속성은 오류 메시지와 마찬가지로 파일의 이름가 문제가 발생한 줄 번호를 저장한다.
함수 또는 메서드에서 문제가 발생하면 스택 트레이스stack trace라는 것도 저장한다. 이것은 해당 함수나 메서드를 호출한 코드 줄 번호를 기록한다.
서로 다른 여러 페이지나 코드 줄 번호에서 동일한 함수나 메서드를 호출할 수 있기 때문에 스택 트레이스는 문제의 원인을 찾는 데 매우 유용할 수 있다. 함수나 메서드에 올바르지 않은 데이터를 전달하여 문제가 발생할 경우, 해당 함수나 메서드가 어디서 호출되었는지를 아는 것은 매우 중요하다.
예외 객체는 두 가지 방법으로 생성할 수 있다.
PHP 7 이후, 가장 치명적인 오류는 PHP 인터프리터가 Error라는 내장 클래스를 사용하여 오류 예외 객체error exception object를 생성한다. 이것은 치명적인 오류를 복구하거나 페이지가 갑자기 종료되는 대신에 사용자 친화적인 메시지를 프로그램이 표시할 수 있게 한다.
프로그래머는 Exception이라는 내장 클래스를 기반으로 사용자 정의 클래스를 만들어 사용자 정의 예외custom exception 객체를 던질 수 있다.
예외는 코드가 동작해야 한다는 것을 알고 있지만 예외적인 상황exceptional situation으로 그 코드가 동작하지 않는 경우에만 사용해야 한다.
예외적인 상황이란 문제가 발생할 수도 있다고 예상되지만 해당 문제가 발생하는 것을 막는 코드를 사용할 수 없는 경우다. 예를 들어
데이터베이스 주도 사이트는 데이터베이스에 의존하는데, 사이트가 데이터베이스와 연결할 수 없다면 이것이 예외 상황이다.
폼 데이터를 수집할 때 사용자는 종종 유효하지 않은 값을 입력한다. 이것은 예외가 아니며 유효성 검사 코드에서 처리되어야 하는 일이다.
예외를 처리하는 데 사용되는 코드는 사이트가 오류를 복구하고 계속 실행하거나 사용자에게 유용한 메시지를 표시할 수 있게 한다.
코드가 작업을 수행하지 못하는 상황을 프로그래머가 예상할 수 있을 때(하지만 발생하는 상황을 유효성 검사 코드와 같은 코드를 사용하여 방지할 수 없을 때), 해당 상황이 발생하면 사용자 정의 예외 객체를 던질 수 있다. 이것은 프로그램이 문제를 복구하거나 스택 트레이스와 함께 문제에 대한 특정 설명을 기록할 수 있다.
사용자 정의 예외 객체를 생성하려면?
사용자 정의 예외 클래스를 생성해야 한다. 모든 사용자 정의 예외는 Exception이라는 내장 클래스를 확장하기 때문에 한 줄의 코드로 사용자 정의 예외 클래스를 생성할 수 있다.
클래스가 다른 클래스를 확장하면 확장하는 클래스의 속성과 메서드를 상속하므로, 사용자 정의 예의 클래스는 Exception이라는 내장 클래스에 정의된 모든 속성과 메서드를 갖는다.
Exception 클래스와 내장 Error 클래스는 모두 Throwable이라는 인터페이스를 구현한다. 인터페이스는 객체가 구현할 속성명 및/또는 메서드명과 반환해야 하는 데이터를 기술한다.
<Throwable 인터페이스의 메서드>
- getMessage() : 예외 메시지. 오류 예외인 경우, 이것은 PHP 인터프리터에 의해 생성되는 치명적인 오류 메시지다. 사용자 정의 예외인 경우, 프로그래머에 의해 생성된 메시지다.
- getCode() : 예외 유형을 식별하는 데 사용되는 예외 코드. 오류 예외인 경우, 이 코드는 PHP 인터프리터에 의해 생성된다. 사용자 정의 예외의 경우, 이 코드는 프로그래머에 의해 정의된다.
- getFile() : 예외가 생성된 파일명
- getLine() : 예외가 생성된 코드 줄 번호
- getTraceAsString() : 문자열인 스택 트레이스
- getTrace() : 배열인 스택 트레이스
사용자 정의 예외 클래스를 생성하고 사용하여 예외를 생성하거나 던지려면 다음과 같이 한다.
class CustomExceptionName extends Exception {}; throw new CustomExceptionName($message[, $code]);
출처 - 존 두켓, <백엔드 프로그래밍을 위한 PHP & MySQL>, Jpub, 2022