2013-05-09 12 views
6

È possibile in PHP?Pausa dal blocco try/catch

try{ 

    $obj = new Clas(); 

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

    // do other stuff here 

}catch(Exception $e){ 

] 

so di poter mettere le altre cose tra {}, ma che aumenta rientro su un blocco di codice più grande e non mi piace è: P

+1

'throw ('Tirami fuori di qui!')' Salta fuori. ma non è esattamente bello –

+3

non puoi usare altro dopo l'if? – mattfryercom

+0

@MattyF - +1, suona come una risposta a me! – adeneo

risposta

3

So che questo aumenta il rientro, ma è un risposta

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

Non poteva solo fare così?

try{ 

    $obj = new Clas(); 

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


}catch(Exception $e){ 

} 
7

Beh, non c'è ragione per questo, tuttavia è possibile divertirsi costringendo un'eccezione nel tuo try blocco, fermando l'esecuzione della funzione.

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

Considerare di lanciare una sottoclasse specifica di Eccezione, piuttosto che un oggetto di eccezione di livello superiore. Quindi, aggiungi catture per le varie possibilità. Simile al commento di Dan. – aaronbauman

11

Con una goto naturalmente!

try { 

    $obj = new Clas(); 

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

    // do other stuff here 

} catch(Exception $e) { 

} 
break_free_of_try: 
5

ho anche affrontato questa situazione, e come te, non volevo innumerevoli if/else if/else if/else in quanto rende il codice meno leggibile.

Ho finito per estendere la classe Exception con la mia. La classe di esempio riportato di seguito è stato per problemi di convalida che, quando innescato produrrebbe un meno grave 'log preavviso'

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"; 
    } 
} 

Nel mio codice principale lo chiamo io;

throw new ValidationEx('You maniac!'); 

Poi alla fine dell'istruzione Try ho

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

felici a commenti e critiche, siamo tutti qui per imparare!

0

In php 5.3+ la cosa bella dell'utilizzo di eccezioni con un blocco catch try è che è possibile creare le proprie eccezioni e gestirle come e quando si desidera. Vedere: Extending Exceptions

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

È quindi possibile intercettare le eccezioni specifiche o utilizzare if ($e instanceof AcceptedException) all'interno catch \Exception blocco per determinare come si desidera gestire l'eccezione (s).

  1. Handled Esempio: http://ideone.com/ggz8fu
  2. non gestita Esempio: 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 
    } 
} 

Questo rende il codice molto più leggibile e più facile da risolvere rispetto a un sacco di soluzioni alternative.