=============
Base Exception Library for PHP 8.3+ (The latest version: 5.1.0)
Missions:
- Additional structural data for exceptions.
- Aspects for exceptions.
- Aggregation exceptions within exceptions.
- Registration exceptions in the global registry for logging.
- Support for the concept of message templates.
- Support tags for exceptions (for elastic logging as example).
And most importantly: make it all easy and simple ;)
class MyException extends \Exceptions\BaseException
{
protected string $template = 'The template error message with {var}';
public function __construct($var)
{
parent::__construct
([
'var' => $this->toString($var)
]);
}
}
$exception = new MyException('string');
// should be printed: The template error message with 'string'
echo $exception->getMessage();
use \Exceptions\Registry;
use \Exceptions\LoggableException;
Registry::resetExceptionLog();
$exception = new LoggableException('this is a loggable exception');
$log = Registry::getExceptionLog();
if($log[0] === $exception)
{
echo 'this is loggable $exception';
}
The basic use:
throw new BaseException('message', 0, $previous);
List of parameters:
// use array()
$exception = new BaseException
([
'message' => 'message',
'code' => 0,
'previous' => $previous,
'mydata' => [1,2,3]
]);
...
// print_r([1,2,3]);
print_r($exception->getExceptionData());
The processor for Monolog
allows populating exception metadata in the log.
<?php
use Monolog\Level;
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use IfCastle\Exceptions\LoggableException;
use IfCastle\Exceptions\MonologProcessor;
$log = new Logger('name');
$log->pushProcessor(new MonologProcessor());
// Put some records to the log
$log->error(
'this is a loggable exception',
['exception' => new LoggableException('this is a loggable exception')]
);
try
{
try
{
throw new \Exception('test');
}
catch(\Exception $e)
{
// inherits data Exception
throw new BaseException($e);
}
}
catch(BaseException $exception)
{
// should be printed: "test"
echo $exception->getMessage();
}
The container is used to change the flag is_loggable
:
try
{
try
{
// not loggable exception!
throw new BaseException('test');
}
catch(\Exception $e)
{
// log BaseException, but don't log LoggableException
throw new LoggableException($e);
}
}
catch(LoggableException $exception)
{
// echo: "true"
if($exception->getPrevious() === $e)
{
echo 'true';
}
}
try
{
dispatch_current_url();
}
catch(BaseException $myException)
{
$myException->appendData(['browser' => get_browser()]);
// and throw exception on...
throw $myException;
}
class ClassNotExist extends BaseException
{
// This exception will be logged
protected bool $isLoggable = true;
/**
* ClassNotExist
*
* @param string $class Class name
*/
public function __construct(string $class)
{
parent::__construct
([
'template' => 'Сlass {class} does not exist',
'class' => $class
]);
}
}
class MyFatalException extends BaseException
{
// This exception has aspect: "fatal"
protected bool $isFatal = true;
}
class MyException extends BaseException
{
public function __construct($object)
{
$this->setDebugData($object);
parent::__construct('its too bad!');
}
}