Como te digo las excepciones suben como burbujas, no siempre vas a a poder testear directamente, imaginate que tienes una clase "VentaDeAutos" esta a su vez usa muchas dependencias, y muy dentro tiene una que usa una clase BD para conectarse.
El estar devolviendo un booleano de error hace el código bastante feo, imagínate algo así:
Código PHP:
Ver originalclass VentaDeAutos
{
public function listaAutosEnVenta()
{
$buscador = new Buscador();
$buscador->listaAutos($tipo = 'venta');
}
}
class Buscador
{
public function listaAutos($tipo)
{
$db = new BD();
$db->conectar();
$db->query($algo);
}
}
class BD
{
public function conectar()
{
if (!$algo) {
throw new \RuntimeException('No se pudo conectar a la base de datos');
}
}
}
try {
$autos = new VentaDeAutos();
$autos->listaAutosEnVenta();
} catch (\RuntimeException $e)
{
logger($e);
imprime_mensaje_error($e->getMessage());
}
Si fura más limpio como propones, tendrías que estar comparando el tipo devuelto por cada método para ver si es un booleano e irlo "subiendo" por las clases hasta poder mostrar el mensaje de error.
El tener excepciones hace más limpio el diseño, a demás de que ayuda mucho al polimorfismo de cada clase, porque si muestras el error con diseño html, etc dentro de la clase BD estas rompiendo con el polimorfismo de la clase BD ya que su responsabilidad no es esa, es solamente interactuar con la base de datos. Además te ayuda mucho a desacoplar tus clases y a re-utilizar tus diseños en diferentes proyectos, eso es el núcleo de un diseño solido.
Saludos.