Дополнительные параметры php

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

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

throw new Exception('this is an error message', 'the field');

Поэтому, когда я показываю сообщение, я могу сделать что-то вроде этого:

show_error($e->getFieldname, $e->getMessage());

Ответ 1

Нет, вам придется подкласс Exception с вашей собственной реализацией и добавить этот метод.

class FieldException extends Exception
{
    protected $_field;
    public function __construct($message="", $code=0 , Exception $previous=NULL, $field = NULL)
    {
        $this->_field = $field;
        parent::__construct($message, $code, $previous);
    }
    public function getField()
    {
        return $this->_field;
    }
}

Но на самом деле, я не являюсь другом добавления методов или свойств в Исключения. Исключение представляет именно это: что-то исключительное, что произошло в вашем приложении. Свойство "field" действительно не является частью Exception, а является частью сообщения об исключении, поэтому я, вероятно, использовал бы правильное сообщение, например:

Неверное значение для поля foo. Исключенная строка, получившая целое число

Ответ 2

Вы можете реализовать свой собственный класс Exception и настроить его.

Подробнее см. Расширение исключений.

Ответ 3

Что я делаю, есть класс для создания пользовательских исключений, но для стандартизации вопросов у меня просто есть один дополнительный аргумент, который является объектом (ну, до сих пор он всегда был массивом), что позволяет мне указывать неограниченное количество данных исключения (очень похоже на исключение javascript).

Вывод:

Fatal error: Uncaught SqlProxyException 'Duplicate entry '1' for key 'PRIMARY'' in     /usr/src/wrangler/trunk/common/SqlProxy.php(356)
#0 /usr/src/wrangler/trunk/common/SqlProxy.php(341): SqlProxy::Update('INSERT into tes...')
#1 /usr/src/wrangler/trunk/common/SqlProxy.php(455): SqlProxy::Insert('INSERT into tes...')
#2 {main}
Array
(
[sql] => INSERT into test SET test='1'
[errorObject] => Array
    (
        [status] => UNKNOWN
        [data] => Array
            (
                [rowsAffected] => -1
                [errorMsg] => Duplicate entry '1' for key 'PRIMARY'
                [errorCode] => 1062
....

В моем коде это достигается следующим образом:

<? require_once "CustomException.php";

## Define the custom exception
class SqlProxyException extends CustomException {}

## Throw a custom exception
throw new SqlProxyException($errorMsg, $errorCode, null, 
    array("sql" => $query, "errorObject" => $result)
);

## Catch the custom exception

try {
   SqlProxy::Insert($argv[2]);
} catch (SqlProxyException $e) {
   fprintf(STDERR, "Fatal error: Uncaught SqlProxyException '%s' in %s(%s)\n%s\n%s\n",
       $e->getMessage(), $e->getFile(), $e->getLine(),
       $e->getTraceAsString(),
       $e->getObject() ? print_r($e->getObject(), 1) : ""
   );
   exit(1);
}  

Не слишком сложно... и волшебство, стоящее за CustomException.php,

<?php

interface IException
{
    /* Protected methods inherited from Exception class */
    public function getMessage();                 // Exception message
    public function getCode();                    // User-defined Exception code
    public function getFile();                    // Source filename
    public function getLine();                    // Source line
    public function getTrace();                   // An array of the backtrace()
    public function getTraceAsString();           // Formated string of trace

    /* Overrideable methods inherited from Exception class */
    public function __toString();                 // formated string for display
    public function __construct($message = null, $code = 0);

}

abstract class CustomException extends Exception implements IException
{ 
    protected $message = 'Unknown exception';     // Exception message
    private   $string;                            // Unknown
    protected $code    = 0;                       // User-defined exception code
    protected $file;                              // Source filename of exception
    protected $line;                              // Source line of exception
    protected $object = null;                     // Extra information in an object (array) js style
    private   $trace;                             // Unknown

    public function __construct($message = null, $code = 0, Exception $previous = null, $eventObject = null)
    {
        if (!$message) {
            throw new $this('Unknown '. get_class($this));
        }
       parent::__construct($message, $code, $previous);
       $this->object = $eventObject;
    }

    public function __toString()
    {
        return get_class($this) . " '{$this->message}' in {$this->file}({$this->line})\n"
                                . "{$this->getTraceAsString()}";
    }

   /* Additional custom method */
   public function getObject()                   // Return object (array) of extra info (js style)
   {
      return $this->object;
   }
}

Ответ 4

Нет необходимости добавлять дополнительный параметр.

Вы можете просто сгенерировать исключение следующим образом:

throw new Exception("My Exception Text", 1234);

И получить доступ к обоим значениям:

catch (Throwable $t)
{  
    echo var_dump($t);
    echo "Exception: " . $t->getMessage();
    echo "Code: " . $t->getCode();
}