自定义例外的默认参数

时间:2018-10-29 10:11:48

标签: php symfony exception-handling

在我的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 :(得分:2)

抛出异常时的常见做法是包括完整的回溯,而不仅仅是抛出异常的类。 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为未捕获的异常向您显示的输出相同。