抛出异常时是否可以添加额外的参数?
当我抛出异常时,我发送错误消息,但我还想在额外的参数中发送字段的名称。类似的东西:
throw new Exception('this is an error message', 'the field');
所以当我显示消息时,我可以这样做:
show_error($e->getFieldname, $e->getMessage());
答案 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();
}