Подтвердить что ты не робот

Можете ли вы передать массив вместо строки в качестве исключения в php?

Я хочу передать массив как исключение в php вместо строки. Возможно ли это сделать, если вы определяете свой собственный класс, который расширяет класс Exception?

Например throw new CustomException('string', $options = array('params'));

4b9b3361

Ответ 1

Конечно. Это будет только для вашего кода обработки ошибок, который должен знать и использовать свойство массива соответствующим образом. Вы можете определить свой собственный конструктор класса исключений, чтобы выполнить любые параметры, которые вы хотите, а затем просто обязательно вызовите конструктор базового класса из определения конструктора, например:

class CustomException extends \Exception
{

    private $_options;

    public function __construct($message, 
                                $code = 0, 
                                Exception $previous = null, 
                                $options = array('params')) 
    {
        parent::__construct($message, $code, $previous);

        $this->_options = $options; 
    }

    public function GetOptions() { return $this->_options; }
}

Затем в вашем кодовом коде...

try 
{
   // some code that throws new CustomException($msg, $code, $previousException, $optionsArray)
}
catch (CustomException $ex)
{
   $options = $ex->GetOptions();
   // do something with $options[]...
}

Взгляните на php docs для расширения класса исключений:

http://php.net/manual/en/language.exceptions.extending.php

Ответ 2

Я думаю, что я немного опоздал с ответом, но я тоже хотел поделиться своим решением. Вероятно, больше людей ищут это:)

class JsonEncodedException extends \Exception
{
    /**
     * Json encodes the message and calls the parent constructor.
     *
     * @param null           $message
     * @param int            $code
     * @param Exception|null $previous
     */
    public function __construct($message = null, $code = 0, Exception $previous = null)
    {
        parent::__construct(json_encode($message), $code, $previous);
    }

    /**
     * Returns the json decoded message.
     *
     * @param bool $assoc
     *
     * @return mixed
     */
    public function getDecodedMessage($assoc = false)
    {
        return json_decode($this->getMessage(), $assoc);
    }
}

Ответ 3

Да, вы можете. Вам нужно будет расширить класс исключений и создать метод __construct() для выполнения того, что вы хотите.

Ответ 4

Если вы не хотите расширять исключение, вы можете закодировать свой массив в строку:

try {
  throw new Exception(serialize(['msg'=>"Booped up with %d.",'num'=>123]));
} catch (Exception $e) {
  $data = unserialize($e->getMessage());
  if (is_array($data))
    printf($data['msg'],$data['num']);
  else
    print($e->getMessage());
}

Вы также можете использовать json_encode/json_decode, если хотите.