在OO PHP中捕获异常

时间:2013-03-24 16:57:01

标签: php oop class error-handling

我有一个班级Person

我想在我的脚本中添加错误处理,因此,用户输入脚本会告诉他们的错误电子邮件地址。通常不是问题,但现在我正在使用OO课程,我在不熟悉的领域。

因此。我想我想知道如何处理多个异常。或者我是否需要一次尝试每个代码行并捕获每一行?这似乎有点过分。理想情况下,我想做以下事情:

try {
    $people[$new]->set_fullname($_POST['name']);
    $people[$new]->set_active(true);
    $people[$new]->set_add1(rEsc($_POST['add1']));
    $people[$new]->set_add2(rEsc($_POST['add2']));
    $people[$new]->set_add3(rEsc($_POST['add3']));
    $people[$new]->set_add4(rEsc($_POST['add4']));
    $people[$new]->set_postcode(rEsc($_POST['postcode']));
    $people[$new]->set_phone(rEsc($_POST['phone']));
    $people[$new]->set_email(rEsc($_POST['email']));
} catch {
      echo 'Caught exception: ',  $e->getMessage(), "\n";       
}

但是在我的错误处理中,如何捕获多个错误?我想将所有错误消息推送到一个数组中,并在网页中很好地显示它们。据我所知,在php.net上,似乎我一次只能收到一条错误消息。

我真的必须try {} catch {}每行代码吗?

4 个答案:

答案 0 :(得分:4)

Imho这不应该首先抛出异常。只需遍历字段并将可能的错误添加到某个$errors数组中。

搞砸场地的用户不是特例。我甚至认为用户对象应该无法验证电子邮件地址。这似乎是表格的责任。

我也想知道您正在使用的rEsc功能是什么。你不仅使用了一个global函数,这使得以后几乎不可能将它换成其他函数(紧耦合),而且名称选择得很糟糕。我也不明白为什么你想逃离那个地方的东西(我猜这就是事情所做的)。仅在使用时转义/清理数据。我想知道你是在逃避数据,因为如果是数据库输入,那就有更好的方法。

答案 1 :(得分:0)

try {
    $people[$new]->set_fullname($_POST['name']);
    $people[$new]->set_active(true);
    $people[$new]->set_add1(rEsc($_POST['add1']));
    $people[$new]->set_add2(rEsc($_POST['add2']));
    $people[$new]->set_add3(rEsc($_POST['add3']));
    $people[$new]->set_add4(rEsc($_POST['add4']));
    $people[$new]->set_postcode(rEsc($_POST['postcode']));
    $people[$new]->set_phone(rEsc($_POST['phone']));
    $people[$new]->set_email(rEsc($_POST['email']));
} catch (Exception $e) {
      echo 'Caught exception: ',  $e->getMessage(), "\n";       
} catch (EmailFormatException $em) {
      echo 'Caught exception: '. $e->getMessage();
}

就这样继续下去

答案 2 :(得分:0)

以下是我的设计方法:

  • 在Person类上创建一个validate()方法,该方法验证每个属性并返回一个字符串数组,向用户解释错误。如果没有错误,请将方法返回null。
  • 根本不要使用例外。他们很慢;它们使代码维护变得复杂(并且您已经看到了迄今为​​止所采用的方法中的症状)
  • 删除用于设置Person对象属性的自定义方法。 PHP不是Java。直接设置属性。

把这一切放在一起:

class Person {

    public $name;
    public $address1;
    public $address2;

    public function validate() { }

}

然后你的代码:

$obj = new Person();
$obj->name = "Bob";
$obj->address1 = "1 Elm St.";
$validationResult = $obj->validate();
if ( $validationResult != null) { // there were errors
    print_r($validationResult);
}

答案 3 :(得分:-3)

您可以创建一个foreach语句,在循环中设置需要使用try / catch进行验证的数据,以便使用错误填充数组:

$errors = [];
foreach (['field1', 'field2', ...] as $field) {
    try {
        $method = "set_{$field}";
        $people[$new]->$method(rEsc($_POST[$field]));
    } catch (Exception $e) {
        $errors[] = $e->getMessage();
    }
}