사용자 정의 예외
사용자 정의 예외(user defined exception)
PHP에서는 Exception 클래스의 인스턴스뿐만 아니라, 사용자가 직접 정의한 예외 객체를 던질 수도 있습니다.
이러한 사용자 정의 예외 클래스는 Exception 클래스를 상속받아 만들 수 있습니다.
Exception 클래스를 상속받은 자식 클래스는 Exception 클래스의 모든 프로퍼티와 메소드에 접근할 수 있습니다.
Exception 클래스의 모든 메소드는 __tostring() 메소드를 제외하고는 오버라이딩할 수는 없습니다.
하지만 사용자 정의 예외 클래스에 사용자가 원하는 메소드를 추가할 수는 있습니다.
예제
class CustomException extends Exception // Exception 클래스를 상속 받아 예외 정의
{
public function errorMessage()
{
$msg = $this->getMessage()."<br/>".
"예외가 발생한 파일 경로 : ".$this->getFile()."<br/>".
"예외가 발생한 라인 번호 : ".$this->getLine();
return $msg;
}
}
try
{
throw new CustomException("예외 메시지"); // 예외 객체 던짐.
}
catch(CustomException $ex) // 예외 처리
{
echo $ex->errorMessage();
}
위의 예제는 try 블록에서 사용자가 직접 정의한 CustomException 객체를 던집니다.
던져진 예외 객체는 catch 블록에서 CustomException 클래스의 errorMessge() 메소드를 사용하여 처리하고 있습니다.
중첩 예외
PHP에서 예외 처리는 중첩될 수 있습니다.
즉, try 블록 안에 또 다른 try 블록을 정의할 수 있으며, 중첩 횟수에도 제한이 없습니다.
각 try 블록은 최소한 하나 이상의 catch 블록이나 finally 블록을 가져야만 합니다.
예제
try
{
try
{
throw new CustomException("예외 메시지"); // 예외 객체 던짐.
}
catch(CustomException $ex) // 예외 처리
{
throw $ex; // catch 블록에서 다시 예외 객체 던짐.
}
}
catch(Exception $ex) // 예외 처리
{
echo $ex->getMessage();
}
위의 예제처럼 catch 블록 안에서도 다시 예외를 던질 수 있습니다.
이렇게 내부 catch 블록에서 다시 던져진 예외는 외부 catch 블록에서 처리됩니다.
위의 예제에서 다시 던져진 예외는 CustomException 클래스의 errorMessage() 메소드가 아닌 Exception 클래스의 getMessage() 메소드에 의해 처리됩니다.
다중 catch 문
하나의 try 블록은 여러 개의 catch 블록을 가질 수 있으며, 각각의 catch 블록이 다른 형태의 예외를 처리하도록 할 수 있습니다.
예외가 발생하면 여러 catch 블록 중에서 던져진 예외 객체를 매개변수로 가지는 가장 처음의 catch 블록이 실행됩니다.
예제
try
{
throw new CustomException("예외 메시지"); // 예외 객체 던짐.
}
catch(customException $ex) // 던져진 예외는 이 곳에서 처리됨.
{
echo $ex->errorMessage();
}
catch(Exception $ex)
{
echo $ex->getMessage();
}
위의 예제처럼 Exception 클래스에 대한 catch 블록은 항상 맨 마지막에 위치해야 합니다.
그렇지 않으면 해당 catch 블록이 발생하는 예외를 모두 처리할 것입니다.
왜냐하면, PHP의 예외 객체는 모두 Exception 클래스에서 파생되기 때문입니다.
위의 예제에서 던져진 customException 예외 객체는 첫 번째 catch 블록에서 처리됩니다.
만약 첫 번째 catch 블록과 두 번째 catch 블록의 순서를 바꾸면, 던져진 예외 객체는 Exception 클래스의 getMessage() 메소드에 의해 처리될 것입니다.