2015-07-06 13 views

Odpowiedz

8

Różne wyjątki dają tylko większą ziarnistość i kontrolę nad tym, jak wychwytywać wyjątki i jak sobie z nimi radzić.

Rozważ klasę, w której robisz wiele rzeczy - np. uzyskiwanie danych wejściowych, sprawdzanie danych wejściowych i zapisywanie ich gdzieś. Możesz zdecydować, że jeśli błędne lub puste argumenty zostaną przekazane do metody get(), możesz rzucić InvalidArgumentException. Podczas sprawdzania poprawności, jeśli coś jest nietypowe lub nie pasuje do siebie, możesz rzucić UnexpectedValueException. Jeśli wydarzy się coś zupełnie nieoczekiwanego, możesz rzucić standardowy Exception.

Jest to przydatne, gdy łapiesz, ponieważ możesz obsługiwać różne typy wyjątków na różne sposoby. Na przykład:

class Example 
{ 
    public function get($requiredVar = '') 
    { 
     if (empty($requiredVar)) { 
      throw new InvalidArgumentException('Required var is empty.'); 
     } 
     $this->validate($requiredVar); 
     return $this->process($requiredVar); 
    } 

    public function validate($var = '') 
    { 
     if (strlen($var) !== 12) { 
      throw new UnexpectedValueException('Var should be 12 characters long.'); 
     } 
     return true; 
    } 

    public function process($var) 
    { 
     // ... do something. Assuming it fails, an Exception is thrown 
     throw new Exception('Something unexpected happened'); 
    } 
} 

w powyższym przykładzie klasy, podczas wywoływania go można catch wiele typów wyjątków tak:

try { 
    $example = new Example; 
    $example->get('hello world'); 
} catch (InvalidArgumentException $e) { 
    var_dump('You forgot to pass a parameter! Exception: ' . $e->getMessage()); 
} catch (UnexpectedValueException $e) { 
    var_dump('The value you passed didn\'t match the schema... Exception: ' . $e->getMessage()); 
} catch (Exception $e) { 
    var_dump('Something went wrong... Message: ' . $e->getMessage()); 
} 

W tym przypadku masz UnexpectedValueException takiego: string(92) "The value you passed didn't match the schema... Exception: Var should be 12 characters long.".

W każdym razie, należy zauważyć, że these exception classes all end up extending from Exception, więc jeśli nie zdefiniujesz specjalnych uchwytów dla InvalidArgumentException lub innych, zostaną one złapane przez łapacze Exception. Naprawdę, dlaczego ich nie używać?

Powiązane problemy