Relanzando excepciones en PHP 7

Relanzar excepciones es una práctica relativamente común en el desarrollo. A veces, deseamos detectar una excepción, analizarla, hacer un poco de lógica adicional y luego volver a lanzar la excepción para que el bloque catch principal pueda manejarla más.
Echemos un vistazo al siguiente ejemplo:

<?php
class FileNotExistException extends Exception {}
class FileReadException extends Exception {}
class FileEmptyException extends Exception {}
$file = 'story.txt';
try {
try {
$content = file_get_contents($file);
if (!$content) {
throw new Exception();
}
}
catch (Exception $e) {
if (!file_exists($file)) {
throw new FileNotExistException();
}
elseif (!is_readable($file)) {
throw new FileReadException();
}
elseif (empty($content)) {
throw new FileEmptyException();
}
else {
throw new Exception();
}
}
}
catch (FileNotExistException $e) {
echo 'Caught FileNotExistException.';
}
catch (FileReadException $e) {
echo 'Caught FileReadException.';
}
catch (FileEmptyException $e) {
echo 'Caught FileEmptyException.';
}
catch (Exception $e) {
echo 'Caught Exception.';
}
finally {
echo 'Finally.';
}

Aquí, definimos tres excepciones simples: FileNotExistException, FileReadException y FileEmptyException. Estos corresponden a tres resultados defectuosos diferentes que podríamos esperar al tratar con nuestro archivo. Luego agregamos algo de lógica alrededor de la llamada a la función file_get_contents, tratando de ajustarla en los bloques try … catch. La función file_get_contents da como resultado booleano falso si el archivo no puede ser leído. Sabiendo eso, y sabiendo que la llamada a la función vacía da como resultado falso si el archivo se encuentra vacío, podemos verificar fácilmente si el archivo está bien o no en una sola declaración if (! $content). Hay varios escenarios posibles una vez que se lanza la Excepción general. El primero y el más obvio es el archivo que falta. Sorprendentemente, incluso con el intento … atrapar bloques en su lugar, si falta el archivo, PHP generará lo siguiente:

Warning: file_get_contents(story.txt): failed to open stream: No such file
or directory in /index.php on line 13
Caught FileNotExistException.Finally.

Podemos ver claramente que se ha generado la advertencia principal del lenguaje PHP, junto con la activación de la captura adecuada y finalmente el bloqueo. Idealmente, nos gustaría salir con la salida de advertencia. Una forma posible es utilizar el operador de control de errores: el signo (@). Suprime tanto errores como advertencias. Esto es bastante peligroso y debe usarse con sumo cuidado. En términos generales, los errores y advertencias se activan para ser manejados, no para ser suprimidos. Sin embargo, en este caso, podríamos llamarlo justificado, ya que estamos envolviendo todo en el intento … atrapar bloques. El último bloque general de captura está simplemente allí para detectar un estado defectuoso inesperado que no está cubierto por nuestras tres excepciones personalizadas.

Comparte