【问题标题】:Having more efficient code to return errors拥有更高效的代码来返回错误
【发布时间】:2013-05-03 20:53:09
【问题描述】:

我创建了一个主类,我的所有主要成员激活停用功能都在其中,与它们相关的所有其他事情也都完成了

这个主类(以及一些主要功能)是从各个地方调用的,包括通过 curl

现在让我们在课堂上使用我的激活功能(主要功能之一)

activationFunction($data)
{
//use data to generate total, discount etc

$this->giveAffiliates($total);
if($this->_error){ return $this->_error;}

$this->activateOrder($total,$discount,id);
if($this->_error){ return $this->_error;}

$this->activatePlan($total,$discount,id);
if($this->_error){ return $this->_error;}

//similarily calling various functions which themselves call other functions

}

activatePlan()
{

try{

//call other functions and do necessary stuff for plan A

 }
catch(Exception $e)
{

$this->_error.="Error occurred while activating plan A";

}
//for plan B
try{

//call other functions and do necessary stuff for plan B

}
catch(Exception $e)
{

$this->_error.="Error occurred while activating plan B";

}

//for other plans similarily

 }
 }

现在的问题是在每个子函数调用之后都有if($this->_error){ return $this->_error;}。(我总共有大约 35 条类似的行) 我需要这个,因为我需要将错误发送给用户并阻止我的代码进一步运行。 但这使我的代码很长而且效率不高。 如何减少所有这些返回,但在其中一个子功能失败时向用户显示错误并尝试保持我的代码结构不变。 我必须从每个主函数调用各种子函数(这是我无法更改的,其中只有一个类和各种函数)并且错误大多必须在每个级别捕获并返回(很少有简单的错误不是返回并允许代码继续运行)。 我还必须记住,以后可以添加各种其他功能,它应该足够灵活,以后可以处理所有这些

【问题讨论】:

  • 我不认为代码执行效率真的是这里的问题。而是代码的可维护性/可读性。
  • 是的,如果不是主要问题,代码可维护性/可读性肯定是一个问题

标签: php performance error-handling coding-style server-side


【解决方案1】:

您说“它使我的代码变长且效率低下”。你到底是什么意思“效率不高”?你是说你的代码很慢?

如果您的代码太慢,那么您需要使用XDebug 之类的工具来分析您的代码,以准确找出您的代码慢的地方。如果你不测量,你只是在猜测问题是什么。

【讨论】:

  • 在我看来每个函数似乎错误之后,必须检查是否存在错误,我想知道是否有更好的方法,然后检查 35 次是否存在错误,然后将错误发送到用户。(我确信这样的代码不会被称为高效,并且随着事情变得更加复杂并且稍后将添加到其中,肯定会使其变慢)
  • “在我看来是错误的”为什么?你认为这需要很多时间吗?我敢打赌它不会。你需要测量才能知道。你做了很多猜测(“肯定让它变慢”、“看起来不对”、“我确信这样的代码不会被称为高效”),但是你需要使用一个工具来告诉你你的猜测是否正确.否则,你就是在浪费时间来加速实际上并不慢的事情。
  • 好的,也会用工具测试一下
【解决方案2】:

我认为每个函数都应该处理自己的错误/异常。这样您就不会将所有错误处理都推到调用该函数的每个地方。函数的调用者不需要包含有关如何从被调用函数生成错误通知的逻辑。

假设你让每个函数在错误条件下抛出一个异常。然后你可以这样做:

activationFunction($data)
{
  //use data to generate total, discount etc
  try {
    $this->giveAffiliates($total);
    $this->activateOrder($total,$discount,id);
    $this->activatePlan($total,$discount,id);
  } catch (Exception $e) {
    // throw the exception up the call chain
    throw $e;
  }
}

【讨论】:

  • 但是让我们在 activatePlan 函数中说:我的计划 A 更新没有给出错误,但我的计划 B 给出了错误,我将如何识别计划 B 给出了更新错误而不是计划 A 它可能没有很容易确定是什么导致了错误,特别是如果同一个表正在更新,几乎没有差异
  • @user1913849 这就是您要放入异常的消息中的全部内容。您可以在抛出异常的被调用函数中尽可能具体地了解导致异常的原因。您还可以创建自己的自定义 Exception 类型,这些类型继承自基本 Exception(这实际上是一种很好的做法)。所以说你有一个数据库连接问题,你可以抛出一个 DBException),或者如果你在读取/写入文件系统时遇到问题,你可以抛出一个 IOException。然后,您可以根据自己的类以不同的方式处理捕获的异常。
  • 我不能使用“throw $e;”因为当我从各个地方调用这个类并通过 curl 执行所有操作并以 json 格式返回数据时,它会给出各种错误。我必须将它存储在一个变量中,然后返回该变量。另外根据具体消息返回消息返回后从调用者文件中运行特定代码
  • @user1913849 好的,那么您可以将异常中的字符串消息存储在变量中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
  • 2016-09-30
  • 1970-01-01
  • 2014-07-03
  • 1970-01-01
  • 2020-12-16
相关资源
最近更新 更多