Building upon a question I already asked regarding exceptions,我担心我可能会错误地编写php函数,或者滥用异常。我这样说的原因是因为如果要使用try / catch块捕获自定义异常,则使用以下函数:
public function get_specific_page($page) {
if (!is_array( $this->_page )){
throw new AisisCore_Template_TemplateException( "<div class='error'>Trying to get a property from a non array.</div>" );
}
return $this->_page[$page];
}
然后会被称为:
try{
get_specific_page($page);
}
catch(Exception $e){
echo $e->getMessage();
}
这种方法的问题在于我有很多像这样编写的函数,要么检查文件是否存在,否则会抛出错误。检查是否在数组中设置了值,抛出错误,我的问题是处理这些函数调用的文件可能会因try catch而过载.....
所以我的问题是,我怎样才能更好地编写这样的函数,以便我没有使用try catch语句加载php文件,但仍然可以拥有自己的自定义函数。
在函数中编写try catch是不是很明显呢?
我问的原因是,因为我是在使用fameworks和我们编写我们的功能的公司,如上所述。我如何处理具有大量这些功能的代码库,而且我没有看到使用它们的一半文件做了一堆尝试捕获......
更新
我正在查看zend源代码以更好地理解异常,并且遇到了这个问题:
public function setMessage($messageString, $messageKey = null)
{
if ($messageKey === null) {
$keys = array_keys($this->_messageTemplates);
foreach($keys as $key) {
$this->setMessage($messageString, $key);
}
return $this;
}
if (!isset($this->_messageTemplates[$messageKey])) {
require_once 'Zend/Validate/Exception.php';
throw new Zend_Validate_Exception("No message template exists for key '$messageKey'");
}
$this->_messageTemplates[$messageKey] = $messageString;
return $this;
}
你可以看到它们如何在底部附近抛出一条新的异常消息,这个函数不是通过执行来调用的:
try{}catch(){}
但是当它抛出异常时,“带有消息的未捕获异常”没有问题
答案 0 :(得分:3)
在我看来,你的方法一般是正确的。但是,有几点说明:
AisisCore_Template_TemplateException
,那么您应该捕获该异常并让所有其他异常冒泡到可以处理它们的异常处理程序。您可以使用set_exception_handler
来定义这样的异常处理程序,该处理程序默认捕获所有未捕获的异常(在Zend Framework的示例中可能就是这种情况)。简单地说:只在您知道如何处理它们的地方捕获异常。为了完整起见,使用例外的一些替代方法:
trigger_error
功能。然而,自定义错误几乎不可能在PHP中捕获(除了使用set_error_handler
,只能在全局级别使用)。