编写处理异常的函数

时间:2013-02-18 22:19:12

标签: php exception

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(){}

但是当它抛出异常时,“带有消息的未捕获异常”没有问题

1 个答案:

答案 0 :(得分:3)

在我看来,你的方法一般是正确的。但是,有几点说明:

  1. 您应该避免在异常消息中使用HTML格式。通常,您不知道如何处理您抛出的异常。例如,异常处理程序可以将消息写入日志文件(您不希望HTML格式化),在特殊错误视图中将其呈现给用户(在这种情况下,视图本身应包含HTML格式),或者完全忽略它(无论如何都不需要格式化)。
  2. 仅捕获您可以处理的异常。如果您知道函数抛出AisisCore_Template_TemplateException,那么您应该捕获该异常并让所有其他异常冒泡到可以处理它们的异常处理程序。您可以使用set_exception_handler来定义这样的异常处理程序,该处理程序默认捕获所有未捕获的异常(在Zend Framework的示例中可能就是这种情况)。简单地说:只在您知道如何处理它们的地方捕获异常
  3. 仅使用名称暗示的异常:处理控制流中的(意外)异常。使用异常来控制程序的常规流程是可能的,但通常认为是糟糕的设计(只是作为旁注,您的代码示例看起来不错)。
  4. 为了完整起见,使用例外的一些替代方法:

    1. 使用返回代码而不是异常。这是老式的C风格。优点是您不需要使用try / catch-statements包装语句。但是,您必须检查每个过程的返回值,这很容易忘记。另一方面,当使用异常时,可以降低意外错误的风险,因为未捕获的异常会在默认情况下产生致命错误。
    2. 使用PHP错误。请参阅trigger_error功能。然而,自定义错误几乎不可能在PHP中捕获(除了使用set_error_handler,只能在全局级别使用)。