【发布时间】:2016-11-04 04:38:09
【问题描述】:
我正在研究一个通过 PHP 应用程序进行 SVN 更改的类。我正在通过 exec() 调用 svn 命令并尝试在错误时抛出异常以恢复任何更改。
这里是SVN类的相关部分:
private function svn_exec($cmd) {
$out = array();
$err = 0;
exec($cmd, $out, $err);
if ($err) {
throw new SVNException("$cmd exited with a status of $err");
}
}
还有自定义的 Exception,与 SVN 类包含在同一个文件中:
class SVNException extends \Exception {
public function __construct($message = null, $code = 0, \Exception $previous = null) {
error_log("SVN Error: " . $message);
parent::__construct("A Subversion error has occurred.", $code, $previous);
}
}
以及另一个类中的调用代码:
public function ApplySVNChanges() {
try {
$svn->update();
// Do a bunch more stuff...
$svn->commit();
} catch (\utils\SVNException $se) {
error_log("Exception caught in SVN class."); // <-- Being logged
$svn->revert();
throw $se; // Throw to caller so db changes are rolled back
}
}
SVN 更新抛出了一个 SVNException,然后我才能继续解释为什么我需要弄清楚我的应用程序正在崩溃并且没有像应该那样处理 SVNException。根据错误日志,SVNException 未处理。对 $svn->update() 的调用位于应该捕获 SVNExceptions 的 try/catch 块中,所以我很困惑为什么它没有被处理。
PHP 致命错误:未捕获的异常 'utils\SVNException' 带有消息“发生了颠覆错误。”在 /path/SVNFunctions.php:114\n堆栈跟踪:\n#0 /path/SVNFunctions.php(73): utils\SVNFunctions->svn_exec('svn update --us...')\n#1 /路径/CallingClass.php(120)
更新:在捕获异常时将消息添加到捕获块以记录日志后,我发现正在捕获 SVN 异常,但是当重新抛出它上面调用它的方法时,它没有捕获它。原始的try catch 块是方法的一部分,该方法被另一个具有自己块的方法调用,以恢复 SVN 和 db 更改以保持它们同步。
try {
ApplySVNChanges(); // Throws SVNException
// Database related changes...
$db-commit();
} catch (Exception $e) {
error_log('Caught Exception in main caller.'); // <-- NOT being logged
if($e instanceof \core\DatabaseException OR $e instanceof \utils\SVNException) {
$db->rollback();
} else {
throw $e;
}
}
根据错误日志,更新命令正在引发异常。它被第一个 catch 捕获,调用了 revert,并且数据库和 SVN 异常的调用方法中的 catch 没有捕获它。
【问题讨论】: