W3docs

getTrace()

Aprende cómo Exception::getTrace() de PHP devuelve la traza de pila como un array, qué contiene cada fotograma y cómo difiere de getTraceAsString().

PHP getTrace()

Exception::getTrace() devuelve la traza de pila de una excepción como un array. Cada elemento describe una llamada a función o método que estaba en la pila de llamadas en el momento en que se lanzó la excepción, ordenada desde el punto de lanzamiento hacia afuera. Es una de las herramientas más útiles para determinar dónde y cómo ocurrió un error.

Esta página explica qué devuelve getTrace(), la estructura de cada fotograma de la traza y cómo difiere del más familiar getTraceAsString(). El método está definido en la interfaz base Throwable, por lo que está disponible en todos los objetos Exception y Error.

public Exception::getTrace(): array

No recibe argumentos y devuelve un array indexado. El fotograma 0 es la llamada más interna (la función que efectivamente lanzó la excepción), y los índices crecen hacia el llamador más externo.

Ejemplo rápido

El siguiente script lanza una excepción desde una llamada anidada e imprime cada fotograma de la traza:

<?php

function readConfig($path) {
    return parseFile($path);
}

function parseFile($path) {
    throw new Exception("Cannot read file: $path");
}

try {
    readConfig('/etc/app.conf');
} catch (Exception $e) {
    $trace = $e->getTrace();
    echo "Number of frames: " . count($trace) . "\n";
    foreach ($trace as $i => $frame) {
        echo "#$i {$frame['function']}() called in {$frame['file']} on line {$frame['line']}\n";
    }
}

Salida:

Number of frames: 2
#0 parseFile() called in /path/to/script.php on line 4
#1 readConfig() called in /path/to/script.php on line 12

Observa que el fotograma de la función que lanzó la excepción (parseFile) reporta la línea donde fue llamada (línea 4, dentro de readConfig), no la línea del propio throw. La línea del throw está disponible por separado mediante getLine() y getFile().

Qué contiene cada fotograma de la traza

Cada fotograma es un array asociativo. Las claves más útiles son:

ClaveDescripción
functionNombre de la función o método que fue llamado.
lineLínea en file donde se realizó la llamada.
fileArchivo donde se realizó la llamada.
classNombre de la clase (solo para llamadas a métodos).
type-> para llamadas de instancia, :: para llamadas estáticas.
argsArray de argumentos pasados a la llamada.

Este script inspecciona un único fotograma en su totalidad:

<?php

function divide($a, $b) {
    if ($b === 0) {
        throw new InvalidArgumentException('Division by zero');
    }
    return $a / $b;
}

try {
    divide(10, 0);
} catch (Exception $e) {
    print_r($e->getTrace()[0]);
}

Salida:

Array
(
    [file] => /path/to/script.php
    [line] => 11
    [function] => divide
    [args] => Array
        (
            [0] => 10
            [1] => 0
        )

)

Nota de seguridad: la entrada args contiene los valores reales de los argumentos, que pueden incluir contraseñas, tokens u otros datos sensibles. Nunca expongas un array getTrace() sin procesar a los usuarios finales — regístralo en el servidor. La configuración INI zend.exception_ignore_args de PHP (activada por defecto desde PHP 7.4) elimina args para evitar filtraciones de datos sensibles; si no ves una clave args, esa es la razón.

getTrace() vs getTraceAsString()

getTrace() te entrega el array sin procesar para que puedas formatearlo, filtrarlo o serializarlo como quieras. Si solo necesitas una cadena legible por humanos, usa getTraceAsString() en su lugar, que devuelve la misma información con formato previo:

<?php

try {
    throw new RuntimeException('Something broke');
} catch (Throwable $e) {
    echo $e->getTraceAsString();
}

Usa la forma de array cuando quieras recorrer los fotogramas de forma programática (por ejemplo, para construir un informe de errores personalizado o enviar datos estructurados a un servicio de registro), y la forma de cadena para visualización rápida o líneas de log.

Dónde encaja getTrace() en la API de excepciones

getTrace() es uno de varios accesores de solo lectura disponibles en todas las excepciones. Son más poderosos cuando se usan juntos dentro de un bloque catch:

Para una visión más amplia del lanzamiento y captura de excepciones, consulta throw, try y la clase Exception.

Buenas prácticas para el manejo de excepciones en PHP

Para garantizar que tu código sea mantenible y fácil de depurar, es importante seguir buenas prácticas al manejar excepciones en PHP. Aquí tienes algunos consejos a tener en cuenta:

1. Usa mensajes de excepción significativos.

Al lanzar una excepción, asegúrate de que el mensaje sea informativo y útil. Debe explicar qué salió mal y cómo solucionarlo. Por ejemplo:

<?php

if ($someCondition) {
  throw new Exception('Invalid input: the email address is not valid.');
}

2. Captura solo las excepciones que puedas manejar.

Al capturar excepciones, es importante capturar solo aquellas que puedes manejar. Si capturas una excepción que no puedes gestionar, podrías acabar ocultando el problema real y dificultando la depuración. Por ejemplo:

<?php

try {
  // Some code that may throw an exception.
} catch (InvalidArgumentException $e) {
  // Handle the invalid argument exception.
} catch (Exception $e) {
  // Handle all other exceptions.
}

3. Registra las excepciones.

Registrar las excepciones puede ayudarte a diagnosticar problemas y solucionar incidencias. Es una buena práctica registrar las excepciones en un archivo o base de datos para poder revisarlas más tarde. Por ejemplo:

<?php

try {
  // Some code that may throw an exception.
} catch (Exception $e) {
  error_log($e->getMessage(), 0);
}

4. Usa jerarquías de excepciones.

Usar jerarquías de excepciones puede ayudarte a organizar tu código y facilitar la captura de tipos específicos de excepciones. Por ejemplo, podrías crear una clase DatabaseException que extienda la clase Exception, y luego lanzar esa excepción cuando ocurra un error de base de datos. Luego podrías capturar solo instancias de DatabaseException al gestionar errores de base de datos.

Conclusión

El manejo de excepciones es un aspecto crítico de la programación en PHP, y el método getTrace() es una herramienta valiosa para depurar y solucionar excepciones. Al devolver un retroceso del contexto de ejecución, puedes identificar con precisión dónde ocurrió una excepción y cómo fue desencadenada.

En esta guía, hemos cubierto los fundamentos del manejo de excepciones en PHP, incluyendo cómo lanzar y capturar excepciones, así como las buenas prácticas para usar excepciones de forma efectiva. También hemos explorado el método getTrace() y cómo puede ayudarte a diagnosticar y corregir errores en tu código.

Siguiendo estas buenas prácticas y aprovechando el método getTrace(), puedes escribir código PHP que sea robusto, fiable y fácil de mantener. El manejo de excepciones puede parecer un detalle menor, pero puede marcar una gran diferencia en la calidad y usabilidad de tu código.

Practice

Práctica
¿Cuál es el propósito de la función getTrace() en PHP?
¿Cuál es el propósito de la función getTrace() en PHP?
Was this page helpful?