php - 在 PHP 中使用 Try-catch 结构

标签 php javascript codeigniter

我以前从未在我的代码中使用过 Try-catch,但现在我需要这样做而且我似乎不太了解它的工作方式。我在使用爆炸得到的字符串中有数据:

$groupNumbers = array();
$str = $dataGroups['groups'];
$groupNumbers = explode(",", $str);
$count = count($groupNumbers);

然后我想检查每个元素是否是数字,如果是我继续进行数据库查询,否则我想中止操作并返回一些错误。

这是我正在做的:

for ($i = 0; $i < $count; ++$i)
    {
        try
        {
            is_numeric($groupNumbers[$i]);

        }
        catch (Exception $ex)
        {
            process_exception_to_json($ex);
        }
    }

如果每个元素都是数字,我会构造一个事件记录来执行 SQL:

$this->db->insert_batch('users_groups', $datas);

显然是这样写的,即使元素不是数字,操作也不会中止,我仍然使用无效值执行 insert_batch,这是我想避免的。这样做的确切方法是什么,所以我可以获得异常,并同时中止操作。 谢谢

莱伦

最佳答案

这是因为is_numericDocs不会抛出异常但会返回一个值。它永远不会失败/抛出异常。

你需要这样做(只是一个例子,我不建议这样做,因为它是多余的):

try
{
    if (!is_numeric($groupNumbers[$i])) {
        throw new RuntimeException('Not numeric.');
    }

}
catch (Exception $ex)
{
    process_exception_to_json($ex);
}

而是创建您自己的组号类型:

try
{
    $groupNumbers = GroupNumbers::createFromString($dataGroups['groups']);
}
catch (Exception $ex)
{
    process_exception_to_json($ex);
}

具有以下类型:

class GroupNumbers extends ArrayObject
{
    public function construct(Array $numbers) {
        foreach ($numbers as $number)
        {
            if (!is_numeric($number))
            {
                throw new InvalidArgumentException(sprintf('Not numeric "%s".', $number));
            }
        }
        parent::__construct($numbers);
    }
    public static function createFromString($string) {
        return new self(explode(",", $string));
    }
}

现在封装了字符串处理,不再有外部循环,GroupNumbers 仅在字符串中有实际数字时才实例化。

如果您不熟悉类,您也可以通过过程式风格获得类似的好处。它可能更容易理解(但几乎相同):

try
{
    $groupNumbers = GroupNumbers_createFromString($dataGroups['groups']);
}
catch (Exception $ex)
{
    process_exception_to_json($ex);
}

function GroupNumbers_createFromString($string)
{
    $numbers = explode(",", $string);
    foreach ($numbers as $number)
    {
        if (!is_numeric($number))
        {
            throw new InvalidArgumentException(sprintf('Not numeric "%s".', $number));
        }
    }
    return $numbers;
}

关于php - 在 PHP 中使用 Try-catch 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10007568/

相关文章:

codeigniter - 如何在 CodeIgniter 3 中安装 Doctrine

php - 如何在 Yii 中使用 PhpExcel 设置特定列的自动换行属性?

php - 禁用输入字段中的 html 标签、php、脚本

javascript - 更改 props 值外部 react 并重新加载组件

javascript - 抽搐相关 : Twitch Video player

php - Codeigniter,路由在生产服务器上不起作用

php - Codeigniter:选择中的前缀字符串到指定的所有列

php - PHP中的数字格式和四舍五入

PHP AES 加密 PKCS5Padding

javascript - JQuery 无法识别动态生成的 id