2012-03-13 15 views
2

マイscript_a.phpを投げていなかった場合にのみコードを実行:問題はClass2::tryThat()が例外を投げることができるということです例外の取り扱い、および例外が

public function tryThis() { 
    Class2::tryThat(); 
    self::logSuccessfulEvent(); 
} 

try { 
    Class1::tryThis(); 
} 
catch (Exception $e) { 
    // Do stuff here to show the user an error occurred 
} 

Class1::tryThis()のようなものを持っています。

例外をスローすると、self::logSuccessfulEvent();という行がまだ実行されているようです。

self::logSuccessfulEvent()は唯一の例外がスローされた、まだ同時に例外がスローされたときscript_a.phpが知らせていないときに発生するように、私はこのコードをリファクタリングすることができますどのように?

+0

問題は別のところです – miki

+0

"それはそうです"? 'tryThat'が未処理の例外を投げた場合、' tryThis'( 'self :: logSuccessfulEvent()')**の次の行は実行されません。** – webbiedave

+0

@webbiedaveとOP:あなたは間違いなしです。次の行は走れず、私が気づいていなかったところで事前に実行されていました。したがって、PHPの例外は私が期待したとおりに動作します。現在のコードブロックで例外をスローするステートメントの後にコードは実行されません。 – eoinoc

答えて

5

この機能は、操作が(真=成功、偽=失敗)成功した​​かどうかを返します

public function tryThis() { 
    $success = true; 

    try { 
     Class2::tryThat(); 
     self::logSuccessfulEvent(); 
    } catch(Exception $e) { 
     $success = false; 
    } 

    return $success; 
} 
2

あなたはケースではないよう記述しています。

コード:

<?php 
class Class1 { 
    public function tryThis() { 
     echo "Class1::tryThis() was called.\n"; 
     Class2::tryThat(); 
     self::logSuccessfulEvent(); 
    } 

    public function logSuccessfulEvent() { 
     echo "Class1::logSuccessfulEvent() was called.\n"; 
    } 
} 

class Class2 { 
    public function tryThat() { 
     echo "Class2::tryThat() was called.\n"; 
     throw new Exception('Exception generated in Class2::tryThat()'); 
    } 
} 

try { 
    Class1::tryThis(); 
} catch (Exception $e) { 
    echo $e->getMessage(), "\n"; 
} 

が出力:あなたが見ることができるように例外がClass2::tryThat()で生成されたときに

Class1::tryThis() was called. 
Class2::tryThat() was called. 
Exception generated in Class2::tryThat() 

Class1::logSuccessfulEvent()メソッドが実行されることはありません、それは(しませんいけません)どちらか。例外が捕捉されるか、致命的なエラーが発生するまで例外は泡立ちます。例外がキャッチされると、プログラムの制御はcatchブロックの後のコードに戻ります。この特定のケースでは、プログラムの制御が決してロギングメソッドに到達しないことを意味します。

+0

それは私が例外が動作すると仮定した方法です。おそらく、例外が発生する前に私のコードがメソッドを呼び出すことを示す記号です。 – eoinoc

関連する問題