异常通过层重新投掷和使用状态代码

时间:2009-11-27 20:53:43

标签: php exception-handling error-code

我搜索了很长时间(这里也是),已经阅读了很多php代码,但仍然找不到令人满意的答案。这似乎是一个太宽泛的话题,但它真的很紧密 - 最后对我来说。你能帮忙吗?

在php网站中,我将PDO作为DAL,BLL对象使用的是什么,并且从UI调用它们。现在,如果某事发生,PDO会抛出PDOException。当然,UI层不必知道有关PDOExceptions的任何信息,因此BLL对象会捕获它。但现在呢?

我已经读过那个

  1. 例外情况适用于真正特殊的情况和
  2. 重新抛出较低层的异常,以免在上层获得低级异常。
  3. 让我说明我的问题(请不要注意函数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的完整堆栈跟踪)。

    提前致谢。

1 个答案:

答案 0 :(得分:0)

据我了解你的帖子,这是一个很好的资源: Api design

我认为你已经完成了你的作业(如果我可以使用这个短语),但你忘记了为什么要做这件事。在你的例子中,我创建了类似

的东西
SignUpException

这会告诉上层有关注册的问题。你在这里做的实际上是用一个不同的命名对象来掩盖一个数据库异常,这本质上是相同的东西,尽管在程序上是正确的,但是错过了为什么 -s在第一次做的事情。的地方。