PHP에서 예외처리를 할 수 있는 try ~ catch 라는 제어문은 try 블록 내에 소스코드 내에 작성하고 예외처리가 있을 경우 catch 블록으로 보내서 처리를 할 수 있게 만들어 준다. finally는 가장 마지막에 실행되는 처리문으로 보면되고 실제 복잡하게 사용한다면 내용만 길어지고 어려울 수 있으니 이번편에서는 예외 프로그램 처리 시 간단한 활용 방법에 대해 알아보도록하자
<?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 블록은 거의 사용 하지 않는다. 그 이유는 지속적인 유지보수를 한다면 프로그램 자체는 간다한 조건에서 끝이 나야 소스 분석도 쉽게 할 수 있기 때문이다.
<?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() 등이 있으며 이외에도 두가지정도 더 있지만 상세 로그를 위한 목적이 아니라면 거의 사용되지 않으니 자세한 사용방법은 아래 내용을 살펴보면 도움이 될것이다.
마지막으로 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();
}
위와 같이 사용하게 되면 매번 작성하지 않고 공통으로 사용할 수 있는 예외처리문을 만들 수 있다.