송효진
php5 에 Exception 이라는 try catch 구문이 있습니다.
하지만 단순히 try { } catch(e) { } 로 사용할 수가 없네요.
클래스를 만들어서 catch 쪽으로 throw 해야 하는것 같군요.
실제적인 ‘감지’ 기능을 못하는것 같습니다.
그래서 ‘감지’가 가능한 함수를 제작했습니다.
include ‘debug.inc’;
SHJTry([감지에러레벨]);
코드
if(false !== ($err = SHJCatch())) {
에러시 코드
}
로 사용하면 됩니다.
debug.inc
/* Debug */
if(!isset($_DEBUG)) {
$_DEBUG = false;
}
$_TRYCATCH = false;
$_ERROR = false;
function SHJErrorHandler($errno, $errstr, $errfile, $errline)
{
global $_DEBUG, $_TRYCATCH, $_ERROR;
$errname = array(E_ERROR => ‘ERROR’, E_WARNING => ‘WARNING’, E_NOTICE => ‘NOTICE’);
switch($errno) {
case E_ERROR:
case E_WARNING:
if($errstr == ‘Division by zero’) {
break;
}
case E_NOTICE:
if($_TRYCATCH & $errno) {
$_ERROR[‘no’] = $errno;
$_ERROR[‘str’] = $errstr;
$_TRYCATCH = false;
} else {
echo “
“;
echo $errname[$errno].’ : ‘.$errstr.’ : ‘.$errfile.’ : ‘.$errline.”
“;
if($_DEBUG) {
print_r(debug_backtrace());
}
echo “
if($_DEBUG) {
exit;
}
}
}
}
function SHJTry($error_level = E_ALL)
{
global $_TRYCATCH;
$_TRYCATCH = $error_level;
}
function SHJCatch()
{
global $_TRYCATCH, $_ERROR;
$_TRYCATCH = false;
if(false !== $_ERROR) {
$err = $_ERROR;
$_ERROR = false;
return $err;
}
return false;
}
error_reporting(E_ALL);
set_error_handler(‘SHJErrorHandler’);
?>
test.php
include_once ‘func.inc’;
include_once “debug.inc”;
SHJTry();
$a = $b;
if(false !== ($err = SHJCatch())) {
echo ‘$a = $b 가 실패했습니다.
‘;
$b = ‘a’;
$a = $b;
echo ‘$b 에 a 를 넣고 $a 에 넣었습니다.
‘;
}
SHJTry();
$a = $b;
if(false !== ($err = SHJCatch())) {
echo ‘$a = $b 가 실패했습니다.
‘;
$b = ‘b’;
$a = $b;
echo ‘$b 에 b 를 넣고 $a 에 넣었습니다.
‘;
}
$a = $c;
?>