2013-05-09 14 views
6

これはPHPで可能ですか?try/catchブロックからのブレーク

try{ 

    $obj = new Clas(); 

    if($obj->foo){ 
    // how to exit from this try block? 
    } 

    // do other stuff here 

}catch(Exception $e){ 

] 

は私が{}の間で他のものを置くことができます知っているが、増加はより大きなコードブロックの上にインデントすることを、私はそれを好きではない:P

+1

'throw( '私をここから出せ!')'が飛び出します。しかし、それはちょうど良いではありません。 –

+3

ifの後にelseを使うことはできませんか? – mattfryercom

+0

@MattyF - +1、私の答えのように聞こえる! – adeneo

答えて

3

私は、これはインデントを増加させるが、当然のgoto

try 
{ 
    $obj = new Clas(); 
    if ($obj->foo) 
    { 
     // do stuff here 
    } 
    else 
    { 
     // do other stuff here 
    } 
} 
catch (Exception $e) 
{ 
    // handle exceptions here 
} 
3

は、あなたはこのように行うことができませんでしたか?

try{ 

    $obj = new Clas(); 

    if(!$obj->foo){ 
    // do other stuff here 
    } 


}catch(Exception $e){ 

} 
7

まあ、そこにそのための理由はありませんが、あなたはあなたのtryブロックで例外を強制的に楽しみを持つことができ、あなたの関数の実行を停止します。

try { 
    if ($you_dont_like_something){ 
    throw new Exception(); 
    //No code will be executed after the exception has been thrown. 
    } 
} catch (Exception $e){ 
    echo "Something went wrong"; 
} 
+0

トップレベルのExceptionオブジェクトではなく、Exceptionの特定のサブクラスを投げることを検討してください。次に、様々な可能性のキャッチを追加します。ダンのコメントに似ています。 – aaronbauman

11

答えです!知っています

try { 

    $obj = new Clas(); 

    if ($obj->foo) { 
    goto break_free_of_try; 
    } 

    // do other stuff here 

} catch(Exception $e) { 

} 
break_free_of_try: 
5

私はまた、このような状況に直面して、あなたが好き、それはコードが読みにくくなりますよう/ else文場合のif /他の場合/他の無数たくありませんでした。

私は自分自身でExceptionクラスを拡張しました。以下の例のクラスがトリガされたときは、それほど深刻な私はそれを呼び出す私のメインのコードで

class ValidationEx extends Exception 
{ 
    public function __construct($message, $code = 0, Exception $previous = null) 
    { 
     parent::__construct($message, $code, $previous); 
    } 

    public function __toString() 
    { 
     return __CLASS__ . ": [{$this->code}]: {$this->message}\n"; 
    } 
} 

「の通知をログ」を生成することを検証問題のためでした。

throw new ValidationEx('You maniac!'); 

は、try文の最後に私がコメントや批判のためのハッピー

 catch(ValidationEx $e) { echo $e->getMessage(); } 
     catch(Exception $e){ echo $e->getMessage(); } 

を持って、我々は学ぶために、すべてここにいます!

0

PHP 5.3以降では、try catchブロックで例外を使用することについての素晴らしい点は、独自の例外を作成して、いつ、いつ、どのように処理できるかという点です。参照:Extending Exceptions

class AcceptedException extends \Exception 
{ 
    //... 
} 

あなたは、特定の例外をキャッチしたり、例外(複数可)をどのように処理するかを決定するためにあなたのcatch \Exceptionブロック内でif ($e instanceof AcceptedException)を使用することができます。例取扱

  1. http://ideone.com/ggz8fu
  2. 未処理の例:http://ideone.com/luPQel
try { 
    $obj = (object) array('foo' => 'bar'); 
    if ($obj->foo) { 
     throw new \AcceptedException; 
    } 
} catch (\AcceptedException $e) { 
    var_dump('I was accepted'); 
} catch (\Exception $e) { 
    if ($e instanceof \InvalidArgumentException) { 
     throw $e; //don't handle the exception 
    } 
} 

これは、他のソリューションの多くとは対照的に、あなたのコードがはるかに読みやすく、容易にトラブルシューティングすることができます。