Обработка исключений и возврат объекта ответа из сервисного уровня - PullRequest
1 голос
/ 17 сентября 2011

У меня есть сервисный уровень, который отвечает за обработку исключений.

Вопрос в том, должен ли я обрабатывать исключения в слое обслуживания и как я могу передать соответствующее сообщение об исключении в представление?

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 ]

1 голос
/ 17 сентября 2011

Даже лучше, чем у Джейсона Борна (да):

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).Таким образом, вы можете сразу увидеть, где было сгенерировано исключение, и вы можете встроить свои собственные дополнительные проверки и т. Д.
  • Вы передаете последнее исключение, чтобы получить больше информации об истории (трассировке) об Исключении.1010 *

    Лучший способ реализовать исключения - это иметь иерархию расширения классов исключений.

    App_Exception extends Zend_Exception
    App_Service_Exception extends App_Exception
    App_Service_Feed_Exception extends App_Service_Exception
    

    Таким образом, каждая папка содержит файл Exception.php.Таким образом, вы можете перехватывать и отбрасывать исключения на каждом уровне, если это необходимо.

1 голос
/ 17 сентября 2011

Все, что вам нужно сделать, это выдать исключение для контроллера 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");
    }
  }
}
0 голосов
/ 18 сентября 2011

Вы можете следовать этому подходу, я обычно придерживаюсь его, когда использую для обработки исключений:

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
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...