1
<?php
declare(strict_types=1);
// 1. Excepciones Personalizadas de Dominio
class SaldoInsuficienteException extends Exception
{
public function __construct(
public readonly float $saldoActual,
public readonly float $montoSolicitado
) {
$faltante = $montoSolicitado - $saldoActual;
parent::__construct("Fondos insuficientes: Tienes $" . number_format($saldoActual, 2) . " y solicitaste $" . number_format($montoSolicitado, 2) . ". Te faltan $" . number_format($faltante, 2));
}
}
class CuentaBloqueadaException extends Exception {}
// 2. Clase de Negocio
class CuentaCajero
{
public function __construct(
private string $cliente,
private float $saldo,
private bool $bloqueada = false
) {}
public function retirar(float $monto): void
{
if ($this->bloqueada) {
throw new CuentaBloqueadaException("La cuenta de {$this->cliente} está temporalmente bloqueada por seguridad.");
}
if ($monto > $this->saldo) {
throw new SaldoInsuficienteException($this->saldo, $monto);
}
$this->saldo -= $monto;
echo "<p style='color:#10b981;'> Retiro exitoso de $" . number_format($monto, 2) . ". Saldo restante: $" . number_format($this->saldo, 2) . "</p>";
}
}
// 3. Manejo con Bloque try - catch - finally
echo "<h2>Procesando Operaciones en Cajero Automático:</h2>";
$cuentas = [
new CuentaCajero("Carlos Mendoza", 500.00, false), // Operación normal
new CuentaCajero("Valeria Torres", 100.00, false), // Saldo insuficiente
new CuentaCajero("Marcos Díaz", 1000.00, true), // Cuenta bloqueada
];
foreach ($cuentas as $i => $cuenta) {
echo "<div style='font-family:system-ui; background:#f8fafc; border:1px solid #cbd5e1; border-radius:8px; padding:12px; margin-bottom:12px;'>";
echo "<strong>Transacción #" . ($i + 1) . ":</strong>";
try {
// Intentar retirar $300
$cuenta->retirar(300.00);
} catch (SaldoInsuficienteException $e) {
echo "<p style='color:#d97706; margin:4px 0;'>⚠️ <strong>Alerta Financiera:</strong> {$e->getMessage()}</p>";
} catch (CuentaBloqueadaException $e) {
echo "<p style='color:#dc2626; margin:4px 0;'>⛔ <strong>Seguridad:</strong> {$e->getMessage()}</p>";
} catch (Throwable $e) {
echo "<p style='color:#b91c1c;'>❌ Error general imprevisto: {$e->getMessage()}</p>";
} finally {
// Se ejecuta SIEMPRE, haya ocurrido error o no
echo "<small style='color:#64748b;'>[Auditoría] Registro de auditoría guardado en el log del sistema.</small>";
}
echo "</div>";
}
Haz clic para editar este código