<?php 
/** 
 * @package package.exceptions.errors 
 * @author Johan Barbier <[email protected]> 
 * @version 20071017 
 * @desc package transforming all php errors into catchable exceptions 
 * 
 */ 
 
/** 
 * @name exceptionErrorGeneric 
 * @desc Generic exceptionError class. Overload Exception::__toString() method and Exception::__construct() method 
 * 
 */ 
abstract class exceptionErrorGeneric extends Exception { 
    /** 
     * @desc Error type 
     * 
     * @var string 
     */ 
    protected $sType; 
     
    /** 
     * @desc Error file 
     * 
     * @var string 
     */ 
    protected $sErrFile; 
     
    /** 
     * @desc Error line 
     * 
     * @var int 
     */ 
    protected $iErrLine; 
     
    /** 
     * @desc Error context 
     * 
     * @var mixed 
     */ 
    protected $mVars; 
     
    /** 
     * @desc is context enabled or not 
     * 
     * @var boolean 
     */ 
    protected $bContext; 
     
    /** 
     * @desc constructor 
     * 
     * @param constant $cErrno 
     * @param string $sErrStr 
     * @param string $sErrFile 
     * @param int $iErrLine 
     * @param mixed $mVars 
     * @param boolean $bContext 
     */ 
    public function __construct($cErrno, $sErrStr, $sErrFile, $iErrLine, $mVars, $bContext = false) { 
        parent::__construct($sErrStr, $cErrno); 
        $this->sErrFile = $sErrFile; 
        $this->iErrLine = $iErrLine; 
        $this->mVars = $mVars; 
        $this->bContext = $bContext; 
    } 
     
    /** 
     * @desc Exception::__toString() overloading 
     * 
     * @return string 
     */ 
    public function __toString() { 
        $sMsg = '<strong>'.$this->sType.'</strong><br />'; 
        $sMsg .= $this->getMessage().'['.$this->getCode().']<br />'; 
        $sMsg .= '<em>File</em> : '.$this->sErrFile.' on line '.$this->iErrLine.'<br />'; 
        $sMsg.= '<em>Trace</em> :<br />'.$this->getTraceAsString().'<br />'; 
        if(true === $this->bContext) { 
            $sMsg.= '<em>Context</em> :<br />'.print_r($this->mVars, true); 
        } 
        return $sMsg; 
    } 
} 
 
/** 
 * @desc exceptionErrors for Fatal errors 
 * 
 */ 
class exceptionErrorError extends exceptionErrorGeneric { 
    protected $sType = 'Fatal error'; 
} 
 
/** 
 * @desc exceptionErrors for Warnings 
 * 
 */ 
class exceptionErrorWarning extends exceptionErrorGeneric { 
    protected $sType = 'Warning'; 
} 
 
/** 
 * @desc exceptionErrors for Parse errors 
 * 
 */ 
class exceptionErrorParseError extends exceptionErrorGeneric { 
    protected $sType = 'Parse error'; 
} 
 
/** 
 * @desc exceptionErrors for Notice 
 * 
 */ 
class exceptionErrorNotice extends exceptionErrorGeneric { 
    protected $sType = 'Notice'; 
} 
 
/** 
 * @desc exceptionErrors for Core errors 
 * 
 */ 
class exceptionErrorCoreError extends exceptionErrorGeneric { 
    protected $sType = 'Core error'; 
} 
 
/** 
 * @desc exceptionErrors for Core warnings 
 * 
 */ 
class exceptionErrorCoreWarning extends exceptionErrorGeneric { 
    protected $sType = 'Core warning'; 
} 
 
/** 
 * @desc exceptionErrors for Compile errors 
 * 
 */ 
class exceptionErrorCompileError extends exceptionErrorGeneric { 
    protected $sType = 'Compile error'; 
} 
 
/** 
 * @desc exceptionErrors for Compile warnings 
 * 
 */ 
class exceptionErrorCompileWarning extends exceptionErrorGeneric { 
    protected $sType = 'Compile warning'; 
} 
 
/** 
 * @desc exceptionErrors for User errors 
 * 
 */ 
class exceptionErrorUserError extends exceptionErrorGeneric { 
    protected $sType = 'User error'; 
} 
 
/** 
 * @desc exceptionErrors for User warnings 
 * 
 */ 
class exceptionErrorUserWarning extends exceptionErrorGeneric { 
    protected $sType = 'User warning'; 
} 
 
/** 
 * @desc exceptionErrors for User notices 
 * 
 */ 
class exceptionErrorUserNotice extends exceptionErrorGeneric { 
    protected $sType = 'User notice'; 
} 
 
/** 
 * @desc exceptionErrors for Strict errors 
 * 
 */ 
class exceptionErrorStrictError extends exceptionErrorGeneric { 
    protected $sType = 'Strict error'; 
} 
 
/** 
 * @desc exceptionErrors for not handled yet errors 
 * 
 */ 
class exceptionErrorNotHandledYet extends exceptionErrorGeneric { 
    protected $sType = 'Not handled yet'; 
} 
 
/** 
 * @desc error handler, calling correct exceptionError type 
 * 
 */ 
class exceptionErrorHandler { 
    /** 
     * @desc translation between context error and exceptionError type of class 
     * 
     * @var array 
     */ 
    public static $aTrans = array ( 
        E_ERROR => 'exceptionErrorError', 
        E_WARNING => 'exceptionErrorWarning', 
        E_PARSE => 'exceptionErrorParseError', 
        E_NOTICE => 'exceptionErrorNotice', 
        E_CORE_ERROR => 'exceptionErrorCoreError', 
        E_CORE_WARNING => 'exceptionErrorCoreWarning', 
        E_COMPILE_ERROR => 'exceptionErrorCompileError', 
        E_COMPILE_WARNING => 'exceptionErrorCompileWarning', 
        E_USER_ERROR => 'exceptionErrorUserError', 
        E_USER_WARNING => 'exceptionErrorUserWarning', 
        E_USER_NOTICE => 'exceptionErrorUserNotice', 
        E_STRICT => 'exceptionErrorStrictError' 
    ); 
     
    /** 
     * @desc is context enabled or not 
     * 
     * @var boolean 
     */ 
    public static $bContext = false; 
     
    /** 
     * @desc constructor, optional bContext boolean can be given if you want context to be displayed or not 
     * 
     * @param boolean $bContext (optional, default = false) 
     */ 
    public function __construct($bContext = false) { 
        self::$bContext = $bContext; 
        set_error_handler(array ($this, 'errorHandler')); 
    } 
 
    /** 
     * @desc error handler 
     * 
     * @param constant $cErrno 
     * @param string $sErrStr 
     * @param string $sErrFile 
     * @param int $iErrLine 
     * @param mixed $mVars 
     */ 
    public function errorHandler ($cErrno, $sErrStr, $sErrFile, $iErrLine, $mVars) { 
        if(!isset(self::$aTrans[$cErrno])) { 
            throw new exceptionErrorNotHandledYet($cErrno, $sErrStr, $sErrFile, $iErrLine, $mVars, self::$bContext); 
        } else { 
            throw new self::$aTrans[$cErrno]($cErrno, $sErrStr, $sErrFile, $iErrLine, $mVars, self::$bContext); 
        } 
    } 
} 
?>
 
 |