我的User类中有一个save方法。
如果save方法遇到验证错误,它会返回我向用户显示的错误数组。但是这意味着在我的代码中我必须写:
if (!$user->save()) {
//display success to user
}
我的保存方法肯定会在成功时返回true。但是在这种情况下如何处理错误?
答案 0 :(得分:9)
使用 try ... catch 语法。
例如:
try {
$user->save();
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
答案 1 :(得分:3)
如果save()
遇到任何问题,我会抛出异常。
如果要提供一系列验证错误,可以继承Exception
并提供存储验证错误的机制。
自定义Exception子类还可以帮助您区分代码明确抛出的异常(您要捕获的异常)和您不期望的异常(这应该是致命的)。
这是子类:
class UserException extends Exception
{
private $userMessages;
public function __construct($message = "", $code = 0, Exception $previous = null, array $userMessages = null)
{
parent::__construct($message, $code, $previous);
if ($userMessages === null) {
$this->userMessages = array();
} else {
$this->userMessages = $userMessages;
}
}
public function getUserMessages()
{
return $this->userMessages;
}
}
这是User
类的愚蠢版本,它始终会在save()
上抛出异常。
class User
{
public function save()
{
$userMessages = array(
'Your password is wrong',
'Your username is silly',
'Your favorite color is ugly'
);
throw new UserException('User Errors', 0 , null, $userMessages);
}
}
使用它:
$user = new User();
try {
$user->save();
} catch (UserException $e) {
foreach ($e->getUserMessages() as $message) {
print $message . "\n";
}
}
你也可以通过填充Exception的$ message来实现这样的事情,比如用分号分隔的消息列表。您甚至可以为错误类型构建常量列表,然后将它们组合为位掩码并将其用于Exception的$ code。这些选项的优点是您将使用内置成员而不添加任何额外的内容。
答案 2 :(得分:2)
一个(糟糕的)习惯我在用erlang玩好后会选择返回元组值(作为php数组)。
function my_func() {
$success = true;
$errors = array();
if ( something_fails() ) {
$success = false;
$errors[] = 'something failed..';
}
return array( $success, $errors );
}
list($success, $errors) = my_func();
if ( ! $success ) {
do_somthing_with( $errors );
}
根据我的经验,当出现疯狂的modify legacy code
故障单并且你真的不敢修改任何东西但是可以更容易地向它添加更多legacy
时,这非常方便。
干杯 -
答案 3 :(得分:1)
返回true或错误数组。 当你检查它时,请使用:
if ($user->save()===true) {
// display success to user
} else {
// display error to user
}
<=> ===运算符执行类型安全比较,这意味着它不仅检查值是否为真,而且还检查类型是否为布尔值。如果返回数组,则将其处理为false。
答案 4 :(得分:0)
最好从像这样的验证函数返回数组
$result['ACK'] = 'true';
$result['message'] = 'Success validation'];
失败
$result['ACK'] = 'false';
$result['message'] = 'validation error message';
现在你可以像这样在前端使用这个数组
if ($result['ACK']) {
//No Error
} else {
echo $result['message'];
}
答案 5 :(得分:0)
将条件更改为,如果为true则成功,否则返回错误数组。
if ($user->save() === true) {
//display success to user
}