Параметры по умолчанию для пользовательского исключения - PullRequest
0 голосов
/ 29 октября 2018

В моем проекте symfony4 я хочу создать пользовательские исключения, поэтому я создал класс исключений:

ApiException

namespace App\Utils;


class ApiException extends \Exception
{

    private $class;
    private $function;

    public function __construct(string $message, string $class, string $function, int $code = 0, \Exception $previous = null)
    {

        $this->class = $class;
        $this->function = $function;

        parent::__construct($message, $code, $previous);

    }

    public function __toString()
    {
        return $this->class.'\\'.$this->function.', Line '.$this->line.': '.$this->message;
    }
}

Брось исключение

throw new ApiException('Please select a date between 1950 and 2050', __CLASS__, __FUNCTION__);

выход

App\\Utils\\Api\\by_year, Line 43: Please select a date between 1950 and 2050

Это именно то, что я хочу, НО, я бы хотел избежать передачи __CLASS__ и __FUNCTION__ в моем исключении. Куда мне нужно ввести эти два параметра, чтобы они всегда были доступны. Вызов его в Exception дает мне имя класса и имя функции ExceptionClass, а не класс, выбрасывающий его?

1 Ответ

0 голосов
/ 29 октября 2018

Обычная практика при создании исключения состоит в том, чтобы включать полную обратную трассировку, а не просто класс, который его выбросил. Класс PHP Exception имеет собственный метод для этого: getTraceAsString, поэтому нет необходимости вручную передавать имя класса или функции. Вы можете изменить свой класс следующим образом:

class ApiException extends \Exception
{
    public function __construct(string $message, int $code = 0, \Exception $previous = null)
    {
        parent::__construct($message, $code, $previous);

    }

    public function __toString()
    {
        return $this->getTraceAsString().': '.$this->message;
    }
}

Если вы хотите показать только определенные уровни обратной трассировки, есть также метод getTrace, который возвращает шаги в виде массива, но, на мой взгляд, полная трассировка всегда будет более полезно.

См. https://3v4l.org/UHI08 для полного примера

Вывод почти идентичен тому, что PHP покажет вам для необработанного исключения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...