Php 通过层重新抛出异常和状态代码的使用

Php 通过层重新抛出异常和状态代码的使用,php,exception-handling,error-code,Php,Exception Handling,Error Code,我在这里也搜索了很长时间,阅读了很多php代码,但仍然找不到满意的答案。这似乎是一个太宽泛的话题,但它真的结合在一起——最终对我来说。你能帮忙吗 在php网站中,我将PDO作为DAL,BLL对象使用什么,它们从UI调用。现在,如果发生了什么事情,PDO将抛出一个PDO异常。当然,UI层不必知道任何关于PDO异常的信息,所以BLL对象会捕获它。但是现在呢 我已经读过了 例外情况适用于真正例外的情况和 其中一个重新抛出来自较低层的异常,以避免在较高层中获得低级异常。 让我举例说明我的问题,请不要注意

我在这里也搜索了很长时间,阅读了很多php代码,但仍然找不到满意的答案。这似乎是一个太宽泛的话题,但它真的结合在一起——最终对我来说。你能帮忙吗

在php网站中,我将PDO作为DAL,BLL对象使用什么,它们从UI调用。现在,如果发生了什么事情,PDO将抛出一个PDO异常。当然,UI层不必知道任何关于PDO异常的信息,所以BLL对象会捕获它。但是现在呢

我已经读过了

例外情况适用于真正例外的情况和 其中一个重新抛出来自较低层的异常,以避免在较高层中获得低级异常。 让我举例说明我的问题,请不要注意函数args:

class User
{
 function signUp()
 {
  try
  {
   //executes a PDO query
   //returns a code/flag/string hinting the status of the sign up:
   //success, username taken, etc.
  }
  catch (PDOException $e)
  {
   //take the appropriate measure, e.g. a rollback

   //DataAccessException gets all the information (e.g. message, stack
   //trace) of PDOException, and maybe adds some other information too
   //if not, it is like a "conversion" from PDOException to DAE
   throw new DataAccessException();
  }
 }
}

//and in an upper layer
$user = new User();
try
{
 $status = $user->signUp();
 //display a message regarding the outcome of the operation
 //if it was technically successful
}
catch (DataAccessException $e)
{
 //a technical problem occurred
 //log it, and display a friendly error message
 //no other exception is thrown
}
这是一个正确的解决方案吗? 当重新抛出PDOException时,我认为使用异常链接是不合适的,因为这只会使调试信息冗余;DataAccessException获取所有内容,包括来自PDOException的完整堆栈跟踪


提前感谢。

据我所知,你的帖子很好的资源是:

如果我能用这个短语,我想你已经完成了你的家庭作业,但是你忘了为什么要做这件事。在您的示例中,我将创建如下内容

SignUpException

这将通知上层,注册出现了问题。您在这里所做的基本上是用不同的命名异常来屏蔽数据库异常,这本质上是相同的,虽然编程上正确,但没有抓住为什么要这样做的要点。

在我看来很好。只要你确定这一点;当您将PDO异常作为更一般的DAE异常重新抛出时,在转换过程中不会丢失任何调试信息。理想情况下,您应该将其作为在基本异常类中指定的第三个参数传递,这样它将被传递。谢谢您的回复!我考虑将传递PDOE的异常链接作为第三个参数,但与php.net示例相反,我真的看不出本例的意义:将有PDOE包含所有有用的调试信息,包装在另一个具有相同数据但来自上面一层的异常中。感谢您的回答!我很高兴我几乎完成了作业:-。你完全正确,我没抓住要点。我要去看视频,它看起来很有趣。