php异常额外参数

时间:2010-10-29 07:30:22

标签: php

抛出异常时是否可以添加额外的参数?

当我抛出异常时,我发送错误消息,但我还想在额外的参数中发送字段的名称。类似的东西:

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

所以当我显示消息时,我可以这样做:

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

4 个答案:

答案 0 :(得分:23)

不,您必须使用自己的实现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;
    }
}

但实际上,我不是向Exceptions添加方法或属性的朋友。 Exception代表的是:在您的应用程序中发生的异常情况。 “field”属性实际上不是Exception的一部分,而是异常消息的一部分,所以我可能会使用正确的消息,如:

  

字段foo的错误值。异常的字符串,得到整数

答案 1 :(得分:1)

您可以实现自己的Exception类,并对其进行自定义。

有关详细信息,请参阅Extending Exceptions文章。

答案 2 :(得分: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;
   }
}

答案 3 :(得分:0)

无需添加额外的参数。

您可以这样抛出异常:

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

并访问两个值:

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