gpt4 book ai didi

php - 编写处理异常的函数

转载 作者:行者123 更新时间:2023-12-04 05:10:48 24 4
gpt4 key购买 nike

Building upon a question I already asked regarding exceptions ,我担心我可能写错了php函数,或者滥用了异常。我之所以这么说,是因为如果要使用 try/catch block 捕获自定义异常,则使用以下函数:

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 一样明显?

我问的原因是因为我习惯于与成名的工作以及在我们编写功能的公司中工作,如您在上面看到的那样。我如何使用具有大量这些功能的代码库,并且我没有看到使用它们的一半文件执行了一堆 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(){}

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

最佳答案

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

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

  • 为了完整起见,使用异常的一些替代方法:
  • 使用返回码而不是异常。这是老式的 C 风格。优点是您不需要使用 try/catch 语句包装语句。但是,您必须检查每个过程的返回值,这很容易忘记。另一方面,使用异常时,可以降低意外错误的风险,因为未捕获的异常默认会产生 fatal error 。
  • 使用 PHP 错误。见 trigger_error 为此发挥作用。然而,在 PHP 中几乎不可能捕获自定义错误(使用 set_error_handler 除外,它仅适用于全局级别)。
  • 关于php - 编写处理异常的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14946338/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com