103 lines
2.2 KiB
PHP
103 lines
2.2 KiB
PHP
|
<?php
|
||
|
namespace nur\b;
|
||
|
|
||
|
use nur\A;
|
||
|
use Throwable;
|
||
|
|
||
|
/**
|
||
|
* Class ExceptionShadow: une classe qui capture les informations d'une
|
||
|
* exception afin de pouvoir les sérialiser
|
||
|
*/
|
||
|
class ExceptionShadow {
|
||
|
protected static function extract_trace(array $trace): array {
|
||
|
$frames = [];
|
||
|
foreach ($trace as $frame) {
|
||
|
$file = A::get($frame, "file");
|
||
|
$line = A::get($frame, "line");
|
||
|
$class = A::get($frame, "class");
|
||
|
$function = A::get($frame, "function");
|
||
|
$type = A::get($frame, "type");
|
||
|
$frames[] = [
|
||
|
"file" => $file,
|
||
|
"line" => $line,
|
||
|
"class" => $class,
|
||
|
"object" => null,
|
||
|
"type" => $type,
|
||
|
"function" => $function,
|
||
|
"args" => [],
|
||
|
];
|
||
|
}
|
||
|
return $frames;
|
||
|
}
|
||
|
|
||
|
function __construct(Throwable $exception) {
|
||
|
$this->class = get_class($exception);
|
||
|
$this->message = $exception->getMessage();
|
||
|
$this->code = $exception->getCode();
|
||
|
$this->file = $exception->getFile();
|
||
|
$this->line = $exception->getLine();
|
||
|
$this->trace = self::extract_trace($exception->getTrace());
|
||
|
$previous = $exception->getPrevious();
|
||
|
if ($previous !== null) $this->previous = new static($previous);
|
||
|
}
|
||
|
|
||
|
/** @var string */
|
||
|
protected $class;
|
||
|
|
||
|
function getClass(): string {
|
||
|
return $this->class;
|
||
|
}
|
||
|
|
||
|
/** @var string */
|
||
|
protected $message;
|
||
|
|
||
|
function getMessage(): string {
|
||
|
return $this->message;
|
||
|
}
|
||
|
|
||
|
/** @var mixed */
|
||
|
protected $code;
|
||
|
|
||
|
function getCode() {
|
||
|
return $this->code;
|
||
|
}
|
||
|
|
||
|
/** @var string */
|
||
|
protected $file;
|
||
|
|
||
|
function getFile(): string {
|
||
|
return $this->file;
|
||
|
}
|
||
|
|
||
|
/** @var int */
|
||
|
protected $line;
|
||
|
|
||
|
function getLine(): int {
|
||
|
return $this->line;
|
||
|
}
|
||
|
|
||
|
/** @var array */
|
||
|
protected $trace;
|
||
|
|
||
|
function getTrace(): array {
|
||
|
return $this->trace;
|
||
|
}
|
||
|
|
||
|
function getTraceAsString(): string {
|
||
|
$lines = [];
|
||
|
foreach ($this->trace as $index => $frame) {
|
||
|
$lines[] = "#$index $frame[file]($frame[line]): $frame[class]$frame[type]$frame[function]()";
|
||
|
}
|
||
|
$index++;
|
||
|
$lines[] = "#$index {main}";
|
||
|
return implode("\n", $lines);
|
||
|
}
|
||
|
|
||
|
/** @var ExceptionShadow */
|
||
|
protected $previous;
|
||
|
|
||
|
function getPrevious(): ?ExceptionShadow {
|
||
|
return $this->previous;
|
||
|
}
|
||
|
}
|