Cuando escribes cΓ³digo, los errores son inevitables, pero lo que realmente importa es cΓ³mo los manejas. En PHP, las excepciones personalizadas son una herramienta poderosa para controlar y comunicar errores especΓficos en tu aplicaciΓ³n. Hoy aprenderΓ‘s cΓ³mo usarlas y sacarles el mΓ‘ximo provecho.
ΒΏQuΓ© son las excepciones personalizadas?
Las excepciones personalizadas te permiten definir tus propios tipos de errores, aΓ±adiendo contexto y claridad al manejo de situaciones excepcionales. Son ΓΊtiles cuando necesitas diferenciar errores especΓficos dentro de tu aplicaciΓ³n.
CΓ³mo crear una excepciΓ³n personalizada
Para crear una excepciΓ³n personalizada, simplemente extiende la clase base Exception.
Ejemplo:
class SinEnergiaException extends Exception {
public function __construct(string $mensaje, int $energiaRestante) {
$mensaje .= " EnergΓa restante: {$energiaRestante}.";
parent::__construct($mensaje);
}
}
AquΓ creamos una excepciΓ³n SinEnergiaException que aΓ±ade informaciΓ³n extra sobre la energΓa restante.
Lanzando una excepciΓ³n personalizada
Puedes usar throw para lanzar tu excepciΓ³n personalizada cuando ocurra un error especΓfico.
Ejemplo:
class Pokemon {
private int $energia;
public function __construct(int $energia) {
$this->energia = $energia;
}
public function atacar(): string {
if ($this->energia <= 0) {
throw new SinEnergiaException("No puedes atacar", $this->energia);
}
$this->energia -= 10;
return "Β‘Ataque realizado! EnergΓa restante: {$this->energia}";
}
}
Si el PokΓ©mon no tiene suficiente energΓa, se lanza una SinEnergiaException.
Capturando excepciones personalizadas
Para manejar estas excepciones, usa un bloque try-catch.
Ejemplo:
$pikachu = new Pokemon(5);
try {
echo $pikachu->atacar(); // Lanza excepciΓ³n
echo $pikachu->atacar(); // Sin energΓa
} catch (SinEnergiaException $e) {
echo "Error: " . $e->getMessage();
}
La salida serΓa:
Error: No puedes atacar. EnergΓa restante: 0.
Esto asegura que el programa no se detenga abruptamente y que puedas manejar el error de forma controlada.
JerarquΓa de excepciones: Β‘Captura lo que necesitas!
Puedes usar una jerarquΓa de excepciones para manejar diferentes tipos de errores.
Ejemplo:
class PokemonException extends Exception {}
class SinEnergiaException extends PokemonException {}
class AtaqueInvalidoException extends PokemonException {}
class Pokemon {
private int $energia;
public function __construct(int $energia) {
$this->energia = $energia;
}
public function atacar(string $ataque): string {
if ($this->energia <= 0) {
throw new SinEnergiaException("No puedes atacar", $this->energia);
}
if ($ataque !== "Impactrueno") {
throw new AtaqueInvalidoException("Ataque no reconocido: {$ataque}");
}
$this->energia -= 10;
return "Β‘{$ataque} realizado! EnergΓa restante: {$this->energia}";
}
}
try {
$pikachu = new Pokemon(10);
echo $pikachu->atacar("Llamarada"); // Lanza AtaqueInvalidoException
} catch (AtaqueInvalidoException $e) {
echo "Error de ataque: " . $e->getMessage();
} catch (SinEnergiaException $e) {
echo "Error de energΓa: " . $e->getMessage();
} catch (PokemonException $e) {
echo "Error general: " . $e->getMessage();
}
Esto organiza los errores en niveles, permitiendo capturar y manejar excepciones especΓficas o generales segΓΊn sea necesario.
Buenas prΓ‘cticas para excepciones personalizadas
- No abuses de las excepciones para errores triviales.
- Proporciona informaciΓ³n adicional en el mensaje de la excepciΓ³n.
- Explica en la documentaciΓ³n de tu cΓ³digo cuΓ‘ndo y por quΓ© se lanza cada excepciΓ³n.
- Si algo no es un
Exception, no lo lances.