在我的symfony4项目中,我想抛出自定义异常,因此我创建了一个异常类:
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的类名和函数名,而不是抛出该类的类?
答案 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为未捕获的异常向您显示的输出相同。