php – Rethrowing部分捕获异常?

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了php – Rethrowing部分捕获异常?脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一些代码,在插入远程数据库时偶尔会遇到唯一的索引冲突.由于我需要随机生成但人类可读的值,因此无法避免违规.不幸的是,当发生这种情况时,PDO会抛出一个通用的PDOException,所以我有一个包含这种可憎的循环:

do {
        ...
   } catch (PDOException $e) {
       if ($e->getCode() === '23000') {
          continue; // have another go
      } else {
          throw new Exception("...",1,$e); // reraise
      }
} while(there was an exception);

我认为错误捕获将比搜索然后插入更好,因为使用四位数代码并且在任何时候只有几百个活动代码将会有很少的冲突.

best practices for catching and re-throwing exceptions?Rethrow php exception into higher level catch block这样的问题表明,即使在PHP中,这也是不好的做法.我都抓到了一个例外,我99%肯定我要重新抛出,而且我正在使用异常进行流量控制.

有没有更好的方法PHP中执行此操作,或者是我在数据库中使用存储过程的唯一替代方法,该存储过程在失败时返回错误代码而不是异常.

解决方法

我的结论是,在PHP中没有更好的方法可以做到一点,所以我将逻辑移到MysqL中,它稍微不那么难看.我正在使用错误处理而不是搜索,因为对于没有冲突的正常情况,这会更快.

首先进行搜索PHP中会慢得多(两个或多个查询),而在sql中的正常情况(一个额外查询)稍慢一些,但如果有很多冲突,那么首先进行搜索会更快而不是插入失败.

DECLARE CONTINUE HANDLER FOR 1062 -- duplicate key
    SET @duPE = 1;

SET @dupe = 0;
SET @attemptsLeft = 5;
REPEAT
    SET @user_code = randomString(4);
    INSERT INTO mytable(expires,user_code,users_id)VALUES(p_expires,@user_code,p_users_id);
    SET @attemptsLeft = @attemptsLeft - 1;
    -- if there's a dupe we get the continue handler above
UNTIL @dupe = 0 OR @attemptsLeft <= 0 END REPEAT;

脚本宝典总结

以上是脚本宝典为你收集整理的php – Rethrowing部分捕获异常?全部内容,希望文章能够帮你解决php – Rethrowing部分捕获异常?所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。