我在代码库中有数百个这样的语句:
if ($stmt->execute(array(/* parameters */))) {
$att = $stmt->fetchAll(); /* or any other fetch method */
} else {
throw new DatabaseException(__METHOD__.": failed");
}
另一种变体,它不会获取任何数据:
if (!$stmt->execute(array(/* parameters */))) {
throw new DatabaseException("Error");
}
在这两种情况下,应删除if ...
和throw ...
,即第一个代码段将缩减为:
$stmt->execute(array(/* parameters */));
$att = $stmt->fetchAll(); /* or any other fetch method */
和第二个:
$stmt->execute(array(/* parameters */));
注意:
array(/* parameters */)
参数存在。$stmt
可能有其他名称(例如$foo
)。 背景:我想让PDO在发生错误时抛出异常,而不是很多自定义代码。目前它设置为默默地忽略错误,这需要大量额外的检查......
注意:如果这对于sed
或类似的工具来说过于复杂,我会接受一个答案,该答案指向另一个有助于避免手动重写所有这些陈述的工具。
答案 0 :(得分:1)
$> cat codes.txt
if ($stmt->execute(array(/* parameters */))) {
$att = $stmt->fetchAll(); /* or any other fetch method */
} else {
throw new DatabaseException(__METHOD__.": failed");
}
if (!$stmt->execute(array(/* parameters */))) {
throw new DatabaseException("Error");
}
$> perl -p0777e 's:(if \(\s*\!?\s*)(.*?)(\s*\)\s*\{\s*)((.*?)\s*\}\s*else\s*\{\s*)?throw .*?;\s*\}:$2;\n$5:g' codes.txt
$stmt->execute(array(/* parameters */));
$att = $stmt->fetchAll(); /* or any other fetch method */
$stmt->execute(array(/* parameters */));
{}
代码。{}
,这将非常困难,我认为regexp无法做到。你需要为此编写一种解析器。