2016-07-01 11 views
2

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がそれをキャッチしていません。

答えて

0

問題が見つかりました。 SVNExceptionを投げ、他のメソッドへの呼び出しを含むtry-catchブロック:

catch (Exception $e) { 
     if($e instanceof \core\DatabaseException OR $e instanceof \utils\SVNException) {   
      $db->rollback(); 
     } else { 
      throw $e; 
     } 
} 

は、実際にSVNExceptionsまたはDatabaseExceptionsをキャッチしていませんでした。例外の前にバックスラッシュを追加すると、問題は解決しました。

catch (\Exception $e) { 

SVNExceptionsは意図したとおりに処理されています。

編集:好奇心のために、https://stackoverflow.com/a/12170579/5530617は、$ svn-> update()がシェルコマンドに--config-dirオプションを追加することで始まる例外をスローする問題を実際に解決しました。

+0

ああ、名前空間。 – Martin

1

どのようにしていますかsvn->revert()svn->revert()svn->execを呼び出しているか、例外を再現するsomehtingを実行している可能性がありますか?

あなたはecho "test"; exit;代わりの$svn->revert();

ようなもので、単にキャッチ部分を変更してテストすることができ..

を私は単純に推測しているが、元に戻すには失敗し、SVNExceptionを投げることができれば、私はここで起こっていただきました!それはだと思います

UPDATE:あなたのアップデート後 は、あなたが変更、タイプミスを追加しましたthrow $seから$throw se

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 
     } 

}

+0

私が呼び出され、更新から例外がスローされたが、呼び出し元からのtry-catchにとらわれない、質問に更新されて戻り、例外がキャッチされた場合、更新からSVNExceptionが実際に巻き込まれているかを決定するためにブロックをキャッチするためのメッセージを追加しました。 – tylero

+0

元に戻すには、独自の例外を投げることができるが、その意図は、その例外がさらにアップし、呼び出し元のメソッドに引っ掛かりです。また、単にテストのために私はそれが起こると何もそこからスローされません取得されたときにログインするために、独自のtry-catchブロック内の行を元に戻す> DB-を置きます。それが幸い実際のプログラムコードではありませんでした、 – tylero

+0

は、あなたの質問更新のタイプミスを見つけたので、私は固定 –

関連する問題