Yo lo veo de otra manera, y es que depende también como hagas la excepción, pero por ejemplo, el login, es algo sencillo:
Código PHP:
Ver originaltry {
$myLoginService->login($user, $pass);
$this->createLocalSession($user);
$this->redirect('/panel');
} catch (LoginException $ex) {
switch ($ex->getCode()) {
case 1: // not found
$sErrorMessage = 'No se encontro el usuario';
break;
case 2: // bad password
$sErrorMessage = 'Password incorrecto';
break;
}
} catch (SessionException ($ex) {
if ($ex->getCode() == 5) { // Por ejemplo que el disco esta lleno y no hay espacio
Alerts::dispatchAlert($ex, 'Error en disco');
$sErrorMessage = 'Error en disco';
$this->redirect('/');
}
$sErrorMessage = 'Error al crear la sesión';
}
De esta forma tienes un mejor control sobre lo que el código puede generar, aunque claro puede esto llegar a muy malos habitos, la idea es controlar exactamente que excepcion esperas encontrar, ya que como dices muchos programadores de Java, tienden a solamente throw new Exception() y se acabo y es casi lo mismo que el Goto.
Es por eso que por ejemplo Zend define un tipo de excepción por cada paquete, para que puedas controlar específicamente que error esperas encontrar, y tengas una mejor forma de mostrar errores al usuario, logear, enviar alertas, etc. en lugar de presentar una pantalla en blanco cuando ocurre un error.