2010-10-29 6 views
8

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

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

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

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

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

ответ

18

Нет, вы должны subclass 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» действительно не является частью исключения, но является частью сообщения об исключении, поэтому я бы, вероятно, использовал правильное сообщение, например:

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

+0

как я его использую? если я действительно создаю новое FieldException ('message', 'field'); Я получаю неправильные параметры для исключения – dazz

+1

@Dazz 'new FieldMessage ('message', 0, NULL, 'field')'. Конструктор для исключений требует сообщения, но также допускает два необязательных аргумента. Изменение порядка может нарушить обработку исключений в сложных приложениях, в которых исключены исключения, поэтому чтобы убедиться, что ничего не сломалось, вы добавляете свой параметр в четвертый (если вы вообще используете это решение) – Gordon

+1

Мне пришлось оставить исключенную предыдущую часть Exception, это только для php 5.3.0+ и i, используя 5.2.9. и в поле $ this-> конструкции должно быть поле $ this -> _. Тогда он отлично работает! Tnx – dazz

0

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

См. Extending Exceptions артикул для деталей.

1

У меня есть класс для создания пользовательских исключений, но для стандартизации вопросов у меня просто есть один дополнительный аргумент, который является объектом (ну, до сих пор он всегда был массивом), что позволяет мне указывать неограниченное количество данных исключения (очень похоже на исключение 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; 
    } 
} 
+0

'$ eventObject' должен предположительно быть' $ object' в вашем конструкторе (или '$ object ['eventObject']')? Кроме того, переопределение/повторное использование защищенных свойств родительского класса «Исключение» представляется ненужным (по ошибке)? – MrWhite

+0

@ w3d хороший catch на $ eventObject. Я не уверен в вопросе об обновлении свойств Exception.Он может быть там как ersatz-документация для класса Exception (или, по крайней мере, список свойств.) Если это приводит к сбою базовой функции Exception, то это определенно будет ошибкой. – Orwellophile

Смежные вопросы