2

基于我已经问过的关于异常的问题,我担心我可能会错误地编写 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 而过载.....

所以我的问题是,我将如何更好地编写这样的函数,这样我的 php 文件就不会被 try catch 语句过度加载,但仍然能够拥有自己的自定义函数。

是否像在它自己的函数中编写 try catch 一样明显?

我问的原因是因为我习惯于与成名的工作以及在我们编写功能的公司中工作,如您在上面看到的那样。我如何使用具有大量这些功能的代码库,并且我没有看到使用它们的一半文件执行了一堆尝试捕获......

更新:

我正在查看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(){}

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

4

1 回答 1

3

我认为,您的方法总体上是正确的。但是,有几点注意事项:

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

为了完整起见,使用异常的一些替代方法:

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