PHPアプリケーションからSVNを変更するためのクラスに取り組んでいます。私はexec()を介してsvnコマンドを呼び出していて、エラー時に例外をスローして変更を元に戻そうとしています。別のクラスでPHP例外がキャッチされない
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);
}
}
そして、呼び出し元のコード: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クラスの一部であります: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 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)
更新:例外がキャッチされているときにログに記録するcatchブロックにメッセージを追加した後、私は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が呼び出され、DatabaseおよびSVN Exceptionsの呼び出しメソッドのcatch
がそれをキャッチしていません。
ああ、名前空間。 – Martin