php例外 - 我们可以多次投掷吗?

时间:2010-09-02 10:11:36

标签: php exception

    if ($disponivel === 0)
    {
        $razao = $check->cd->reason;
        $mensagem = "the domain isn't available. Reason: ".$razao;
    }
    elseif($disponivel === 1)
    {
        $mensagem = "the domain doesn't exist - free to register.";
    }

    return $mensagem;
}
else
{
    throw new EppCommandsExceptions('Domain isn't supported - '.$result->msg, $codigo);
}

你看到那些$ mensagem字符串了吗?它们也是错误消息,我的问题是,不是让$ mensagem显示一些错误消息,我们可以使用几个throw异常吗?

更新: 我并不是要一次性抛出异常。他当时的每个例外。

提前致谢, MEM

4 个答案:

答案 0 :(得分:5)

你的意思是

else {
    throw new XException(...);
    throw new YException(...);
    throw new ZException(...);
}

......并且所有这些都被“立刻”抛出?

不,那不可能,也不会有太多意义。如何捕获这些异常的客户端代码?

此外,您不应该使用异常作为正常流控制结构的替代,异常应该只处理异常错误,例如无法连接到数据库等。

您可以实现另一个自定义异常类,它将一个错误数组作为参数,客户端代码可以执行以下操作:

catch(SomeException $e) {
    $messages = $e->getErrorMessages();
}

由于我不会说你的语言,我真的不能告诉你在你发布的代码中想要做什么,否则我可以提出一些更具体的建议。


EDIT / UPDATE:

@MEM感谢您使用英语错误消息更新代码。您是否实施了域名注册服务?

当然,这是一个有点困难的话题,因为每个人都有自己的偏好,但如果e,我不会抛出异常。 G。用户尝试注册已被其他人使用的域。这不是一个特殊的状态,这是例外。我会创建一个验证类/方法来收集这些错误消息,然后这些错误消息会显示给用户。

我什么时候会在像您这样的应用中抛出异常?我不太了解域名注册,但如果您从远程服务器/ webservice获取域名是否空闲且该Web服务已关闭,那么我会抛出异常。它被控制器(我想象一个MVC网络应用程序)捕获,然后通过“服务器关闭,请稍后再试”消息回复客户端。

答案 1 :(得分:5)

你不能抛出多个,但是从PHP 5.3开始,你可以向异常的构造函数提供previous来创建一个链接的异常列表。

例如,这里有一个3项链:

$a = new Exception('Exception a');
$b = new Exception('Exception b', 0, $a);
throw new Exception('Exception c', 0, $b);

然后,在您的异常处理程序中,您可以使用getPrevious

遍历链
do {
    printf("%s:%d %s (%d) [%s]\n", $e->getFile(), $e->getLine(), $e->getMessage(), $e->getCode(), get_class($e));
} while($e = $e->getPrevious());

答案 2 :(得分:1)

你可以抛出并捕获不同的异常。

如果您只想打印错误,您也可以抛出相同类型的异常。但我会假设您需要针对每个案例采用不同的方法

function myFunction() {
  if($a) {
    throw new AException('A Error');
  } else if($b) {
    throw new BException('B Error');
  } else if($c) {
    throw new CExceptıon('C Error');
  }
}

try {
  myFunctıon();
} catch (AException $aException) {
  echo $aException->getMessage();
} catch (BException $bException) {
  echo "this is a terrible case, don't do that again pls";
  $mydbobject->rollback();
} catch (CException $cException) {
  mailDevTeam("the server made a boo boo");
}

答案 3 :(得分:0)

当然,只需为每条消息创建基本异常的子类。