Im работает над классом, чтобы SVN менялся с помощью приложения PHP. Я вызываю команды svn через exec() и пытаюсь исключить исключение из ошибки, чтобы отменить любые изменения.PHP Исключение не поймано
Вот соответствующая часть класса 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");
}
}
И пользовательские исключения, содержащаяся в том же файле, что и класс 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() находится в блоке try/catch, который должен улавливать SVNExceptions, поэтому я смущен тем, почему он не обрабатывается.
PHP Fatal error: Uncaught exception 'utils\SVNException' with message 'A Subversion error has occurred.' in /path/SVNFunctions.php:114\nStack trace:\n#0 /path/SVNFunctions.php(73): utils\SVNFunctions->svn_exec('svn update --us...')\n#1 /path/CallingClass.php(120)
Update: После добавления сообщений в улове блоки для входа, когда исключения ловятся, я обнаружил, что исключение 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;
}
}
В соответствии с журналами ошибок команда update выбрасывает исключение. Он улавливается первым уловом, вызывается возврат, а catch
в вызывающем методе для баз данных и исключений SVN не улавливает его.
Ааааа .... Пространство имен – Martin