PHP에서 예외처리를 할 수 있는 try ~ catch 라는 제어문은 try 블록 내에 소스코드  내에 작성하고 예외처리가 있을 경우 catch 블록으로 보내서 처리를 할 수 있게 만들어 준다. finally는 가장 마지막에 실행되는 처리문으로 보면되고 실제 복잡하게 사용한다면 내용만 길어지고 어려울 수 있으니 이번편에서는  예외 프로그램 처리 시 간단한 활용 방법에 대해 알아보도록하자 

 

숫자가 1인지 그리고 정수인지 체크
<?php 
try{
	$result = '';
	$num = '1';
	if($num != 1){ throw new Exception("숫자 1이 아닙니다.");}
	if($num !== 1){ throw new Exception("숫자 1이 정수가 아닙니다.");}
	$result = '성공';
}
catch(Exception $e){
	$result = '실패 ('.$e->getMessage().')';
}
finally{
	echo '예외처리 결과: '.$result;
}

echo '<hr />';

try{
	$result = '';
	$num = 1;
	if($num != 1){ throw new Exception("숫자 1이 아닙니다.");}
	if($num !== 1){ throw new Exception("숫자 1이 정수가 아닙니다.");}
	$result = '성공';
	return false; // return 이 되더라도 finally 블록은 return 되기 전 시점까지 실행이 된다.
}
catch(Exception $e){
	$result = '실패('.$e->getMessage().')';
}
finally{
	echo '예외처리 결과: '.$result;
}

 

|결과

예외처리 결과: 실패 (숫자 1이 정수가 아닙니다.)
예외처리 결과: 성공

 

위의 예제소스를 보면 두개의 예외처리문이 있으며 각 $num 변수에 대한 조건이 성립 또는 실패할 경우에 따라 결과를 출력해준다. 일반적으로 내가 사용하는 프로그램에서는 finally 블록은 거의 사용 하지 않는다. 그 이유는 지속적인 유지보수를 한다면 프로그램 자체는 간다한 조건에서 끝이 나야 소스 분석도 쉽게 할 수 있기 때문이다.  

 

catch 블록에서 자주 사용하는 객체 메서드 
<?php 
try{
	$num = 1;
	if($num != 1){ throw new Exception("숫자 1이 아닙니다.",-1);}
	if($num !== 1){ throw new Exception("숫자 1이 정수가 아닙니다.",-9999);}

	$num = '2';
	if($num !== 2 ){ throw new Exception("숫자 2는 정수가 아닙니다.",-9999);}
	
}
catch(Exception $e){
	$catch = array('메시지:'.$e->getMessage(),'코드:'.$e->getCode(),'라인:'.$e->getLine(),'파일:'.$e->getFile());
	echo implode("<br>",$catch);
}

 

|결과

메시지:숫자 2는 정수가 아닙니다.
코드:-9999
라인:8
파일:/home/redinfo/try.php

 

catch 블록에서 사용가능한 객체 메서드는 예제소스와 같이 getMessage(), getCode(), getLine(), getFile() 등이 있으며 이외에도 두가지정도 더 있지만 상세 로그를 위한 목적이 아니라면 거의 사용되지 않으니 자세한 사용방법은 아래 내용을 살펴보면 도움이 될것이다.

 
PHP: Exceptions - Manual
PHP: Exceptions - Manual
www.php.net/manual/en/language.exceptions.php

 

마지막으로 catch 블록으로 보낼때 throw new Exception 문을 사용하게 되는데 공통 처리를 위해 이를 아래와 같이 변경하여 사용할 수 도있다. 

<?php 
class TestException extends Exception{
	function allView(){
		$catch = array('메시지:'.$this->getMessage(),'코드:'.$this->getCode(),'라인:'.$this->getLine(),'파일:'.$this->getFile());
		echo implode("<br>",$catch);		
	}
}

try{
	$num = 1;
	if($num != 1){ throw new TestException("숫자 1이 아닙니다.",-1);}
	if($num !== 1){ throw new TestException("숫자 1이 정수가 아닙니다.",-9999);}

	$num = '2';
	if($num !== 2 ){ throw new TestException("숫자 2는 정수가 아닙니다.",-9999);}
	
}
catch(TestException $e){
	$e->allView();
}

 

위와 같이 사용하게 되면 매번 작성하지 않고 공통으로 사용할 수 있는 예외처리문을 만들 수 있다.