自定义异常的默认参数

Default Params for a custom exception

在我的 symfony4 项目中,我想抛出自定义异常,所以我创建了一个异常 Class:

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__。 我需要在哪里注入这两个参数才能始终可用。在异常中调用它给我 Class 异常的名称和函数名称 Class,而不是 Class 抛出它?

抛出异常时的常见做法是包含完整的回溯,而不仅仅是抛出异常的 class。 PHP 的 Exception class 有一个本地方法:getTraceAsString,所以永远不需要手动传入 class 或函数名。您可以修改您的 class 如下:

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 方法,将步骤 returns 作为一个数组,但在我看来,完整的跟踪总是会更有用。

有关完整示例,请参阅 https://3v4l.org/UHI08

输出几乎与 PHP 显示的未捕获异常相同。