【问题标题】:Default Params for a custom exception自定义异常的默认参数
【发布时间】:2018-10-29 10:11:48
【问题描述】:

在我的 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 的类名和函数名,而不是抛出它的类?

【问题讨论】:

  • 你为什么还要搞乱你的构造函数?无论如何,异常回溯会告诉你所有这些!为什么不放弃构造函数而只连接消息字符串呢? throw new ApiException('Please select a date between 1950 and 2050 in ' . __CLASS__, '::' .__FUNCTION__);

标签: php symfony exception-handling


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 2018-08-30
    • 2011-08-26
    相关资源
    最近更新 更多