我有一个负责处理异常的服务层。
问题是,我应该处理服务层中的异常吗?如何将适当的异常消息传递给视图?
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) {
}
}
或者,我想知道是否在控制器中处理异常......
答案 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);
}
}
}
为什么这样更好?
实现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
}
}
}