我有一些代码,期望在向远程数据库插入数据时偶尔会出现唯一索引冲突。由于我需要一个随机生成但易于人类阅读的值,因此无法避免此冲突。不幸的是,当这种情况发生时,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);
我认为错误捕获机制比搜索后插入记录更好,因为在一个四位数代码和仅有几百个活动代码的情况下,会发生的冲突很少。
Stack Overflow上的问题,例如最佳实践:捕获并重新抛出异常?和将PHP异常重新抛到更高层的catch块中表明即使在PHP中,这也是不良行为。我既捕获了一个我99%确定会重新抛出的异常,又将异常用于流程控制。
在PHP中是否有更好的方法来解决这个问题,或者我唯一的选择是在数据库中使用存储过程,在失败时返回错误代码而不是异常?