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ć?
patrz http://tutorials.jenkov.com/java-exception-handling/exception-hierarchies.html – VolkerK