0

我有一堂课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

4 回答 4

4

恕我直言,这不应该首先引发异常。只需遍历字段并将可能的错误添加到某个$errors数组。

用户搞砸字段并不是个例。我什至不认为用户对象应该能够验证电子邮件地址。这似乎是表单的责任。

我也想知道rEsc你正在使用什么功能。您不仅使用了一个global功能,将来几乎不可能将其换成其他功能(紧密耦合),而且名称选择不当。我也看不出你为什么要在那个地方逃避东西(我想这就是事情的作用)。仅在使用数据时转义/清理数据。而且我想知道您在转义数据的原因是什么,因为如果是用于数据库输入,则有更好的方法。

于 2013-03-24T17:55:17.800 回答
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();
}

就这样继续

于 2013-03-24T17:00:23.500 回答
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);
}
于 2013-03-24T23:04:23.890 回答
-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();
    }
}
于 2013-03-24T17:33:56.323 回答