处理异常并从服务层返回响应对象

时间:2011-09-17 01:33:41

标签: oop zend-framework design-patterns exception exception-handling

我有一个负责处理异常的服务层。

问题是,我应该处理服务层中的异常吗?如何将适当的异常消息传递给视图?

class App_Service_Feed {
  function create() {
    //...
    try {
      $feed->getMapper->insert();
    } catch (Zend_Db_Statement_Exception $e) {
      //what do I return here?        
    } catch (Exception $e) {
      //what do I return here?
    }
  }
}

我正在考虑返回一些描述的响应对象,以便在我的控制器中操纵它。

class App_Controller {
  //...
  $response = $service->create();
  if($response->status) {

  }
}

或者,我想知道是否在控制器中处理异常......

3 个答案:

答案 0 :(得分:1)

您需要做的就是抛出Zend Front控制器的异常以捕获它后者

class App_Service_Feed {
  function create() {
    //...
    try {
      $feed->getMapper->insert();
    } catch (Zend_Db_Statement_Exception $e) {
      throw new Zend_Exception("my own message");      
    } catch (Exception $e) {
      throw new Zend_Exception("my different message");
    }
  }
}

答案 1 :(得分:1)

甚至比杰森伯恩的方式更好(是的):

class App_Service_Feed {
  function create() {
    //...
    try {
      $feed->getMapper->insert();
    } 
    catch (Zend_Db_Statement_Exception $e) 
    {
      throw new App_Service_Feed_Exception("Your own message", NULL, $e);      
    } 
    catch (Exception $e) 
    {
      throw new App_Service_Feed_Exception("Your other message", NULL, $e);
    }
  }
}

为什么这样更好?

  • 您正在使用自己的Exception类(扩展Zend_Exception)。因此,您可以立即看到抛出异常的位置,并且可以构建自己的附加检查等。
  • 您正在传递最后一个例外,以获得有关例外的更多历史信息(跟踪)。

实现Exceptions的最佳方法是使用扩展Exception类的层次结构。

App_Exception extends Zend_Exception
App_Service_Exception extends App_Exception
App_Service_Feed_Exception extends App_Service_Exception

所以每个文件夹都包含一个Exception.php。这样,如有必要,您可以在每个级别捕获并重新抛出异常。

答案 2 :(得分:0)

当我使用异常处理时,你可以遵循这种方法我通常会遵循它:

class App_Service_Feed {


function create() throws CustomException, OtherCustomException {
    //...
    try {
      $feed->getMapper->insert();
    } catch (Zend_Db_Statement_Exception $e) {
      //you can throw ur custom exception here. 
      //By doing so you can increase its functionality and understand what is the problem
       throw new CustomException();       
    } catch (Exception $e) {
      //here u can check some general exception like NullPointer, IOException etc(related 
      //to ur case) using instanceof.
      throw new OtherCustomException

    }
  }
}

现在在您的控制器中,您需要处理此异常并显示一些消息: -

class App_Controller {
  //...
  App_Service_Feed obj = new App_Service_Feed();
  try{  
   obj.create()
  }catch(CustomException c)
   {
     //display message
   }catch(OtherCustomException o)
    {
      //display other message
    }
  }
}