Advertisement
  1. Code
  2. PHP
  3. Yii

Como Manejar Errores y Excepciones en el Framework de Yii

Scroll to top
Read Time: 7 min

() translation by (you can also view the original English article)

Final product imageFinal product imageFinal product image
What You'll Be Creating

Introducción

En el tututorial de hoy, voy a introducirlos en el manejo de errores y excepciones de Yii y a guiarlos a través de algunos escenarios introductorios.

Te preguntaras ¿qué es Yii? revisa nuestra Introducción al Framework de Yii y la serie Programando Con Yii2.

¿Cuál es la Diferencia Entre Errores y Excepciones?

Los errores so fallas inesperados en nuestro código a menudo descubiertos por primera vez por los usuarios. Estos Típicamente rompen la ejecución del programa. Es importante no solo fallar elegantemente para el usuario sino informar al desarrollador acerca del problema así puede ser reparado.

Las excepciones son creadas por el desarrollador cuando una condición de error potencialmente predecible ocurre. En el código cuando una excepción puede ocurrir, el desarrollador puede lanzar() una excepción a un robusto manejador de errores.

¿Cómo Maneja Yii Estos?

En Yii, los errores de PHP no-fatales (e.j. Advertencias y avisos) son enviados a excepciones que pueden ser capturadas y así puedes decidir como reaccionar y responder ante ellas. Puedes designar un controlador de acción para procesar todas estas excepciones. Y puedes personalizar el formato de como mostrar lo errores, e.j. HTML, JSON, XML, etc.

Las excepciones y errores fatales de PHP pueden ser accedidas únicamente en modo de depuración. En este tipo de escenarios de desarrollo, Yii puede mostrar información de tallada de la llamada de pila y segmentos del código fuente (puedes ver esto arriba en la imagen del titulo).

Errores Fatales son el tipo de evento que puede detener la ejecución de una aplicación. Estas incluyen quedarse sin memoria, instanciar un objeto de una clase que no existe, o llamar a una función que no existe.

Por ejemplo: 

1
$t = new Unknownobject();

Vamos a empezar con algunos ejemplos de manejo de errores y excepciones.

Configurando el Manejo de Errores y Excepciones

Primero, configuramos nuestra aplicación en frontend/config/main.php. El errorHandler es definido como un componente, como se muestra debajo. Este ejemplo es de mi aplicación de las series startup, Meeting Planner. Nótese la configuración del errorHandler en components:

1
<?php
2
$params = array_merge(
3
    require(__DIR__ . '/params.php'),
4
    require(__DIR__ . '/params-local.php')
5
);
6
return [
7
    'id' => 'mp-frontend',
8
    'name' => 'Meeting Planner',
9
    'basePath' => dirname(__DIR__),
10
    'bootstrap' => ['log','\common\components\SiteHelper'],
11
    'controllerNamespace' => 'frontend\controllers',
12
    'catchAll'=> [],
13
    'components' => [
14
      'assetManager' => [...],
15
      ...
16
      'errorHandler' => [
17
            'errorAction' => 'site/error',
18
            'maxSourceLines' => 20,
19
        ],
20
        ...
21
    ],
22
];

En el ejemplo anterior, errorAction dirige al usuario a la acción de error de mi SiteController. 

Mas ampliamente, Yii ofrece una variedad de opciones de configuración para erroHandler para la redirección y recolección de datos:

Propiedad Typo Descripción
$callStackItemView string La ruta al archivo de la vista para presentar excepciones y errores de llama a elementos de pila. e.j. '@yii/views/errorHandler/callStackItem.php'
$displayVars array Lista de variables predefinidas de PHP que deberían ser mostradas en la pagina de error. e.j.  ['_GET', '_POST', '_FILES', '_COOKIE', '_SESSION']
$errorAction string La ruta (e.j. site/error) a la acción del controlador que se va a usar para mostrar errores externos.
$errorView string La ruta al archivos de vista para mostrar excepciones sin llamar a la información de pila. e.j. '@yii/views/errorHandler/error.php'
$exceptionView string La ruta al archivo de la vista para mostrar excepciones. ej. '@yii/views/errorHandler/exception.php'
$maxSourceLines integer Número máximo de lineas de código que se van a mostrar.
$maxTraceSourceLines integer Número máximo de lineas de código de  traza que se van a mostrar.
$previousExceptionView string La ruta al archivo de la vista para mostrar excepciones anteriores. ej. '@yii/views/errorHandler/previousException.php'

Usando errorActions para Ejecución Directa

Generalmente, Cuando un usuario encuentra un error serio, queremos redirigirlo a una pagina de error descriptiva, y amigable.

Esto es lo que el errorAction en errorHandler hace.

1
return [
2
    'components' => [
3
        'errorHandler' => [
4
            'errorAction' => 'site/error',
5
        ],
6
    ]
7
];

En nuestro SiteController, decidimos una acción explicita de error:

1
namespace app\controllers;
2
3
use Yii;
4
use yii\web\Controller;
5
6
class SiteController extends Controller
7
{
8
    public function actions()
9
    {
10
        return [
11
            'error' => [
12
                'class' => 'yii\web\ErrorAction',
13
            ],
14
        ];
15
    }
16
}

Aquí este un manejador de errores básico (puedes leer mas acerca de estos aquí):

1
public function actionError()
2
{
3
    $exception = Yii::$app->errorHandler->exception;
4
    if ($exception !== null) {
5
        return $this->render('error', ['exception' => $exception]);
6
    }
7
}

Puedes responder de forma diferente dependiendo de si es un error o si la pagina solicitada no existe en tu aplicación:

1
public function actionError()
2
    {
3
        $exception = Yii::$app->errorHandler->exception;
4
        if ($exception instanceof \yii\web\NotFoundHttpException) {
5
            // all non existing controllers+actions will end up here

6
            return $this->render('pnf'); // page not found

7
        } else {
8
          return $this->render('error', ['exception' => $exception]);
9
        }
10
    }

Aquí esta mi actual manejador de error para 404 Pagina No Encontrada:

Yii2 Error Handling and Exceptions 404 Page Not Found ErrorYii2 Error Handling and Exceptions 404 Page Not Found ErrorYii2 Error Handling and Exceptions 404 Page Not Found Error

En tus paginas de errores puedes teóricamente incluir un mapa del sitio de todos los enlaces, sugerir paginas similares a la pagina solicitada, una herramienta de búsqueda y un enlace para contactar a soporte. Todo esto puede ayudar al usuario a recuperarse y continuar elegantemente.

Aquí esta mi actual pagina de error general (obviamente yo tengo características que agregar)

Yii2 Error Handling and Exceptions Typical Page ErrorYii2 Error Handling and Exceptions Typical Page ErrorYii2 Error Handling and Exceptions Typical Page Error

Atrapando Excepciones

Si queremos monitoriar una sección de código por problemas, podemos usar un bloque try catch de PHP. Debajo vamos a experimentar desencadenando un error fatal de división por cero:

1
use Yii;
2
use yii\base\ErrorException;
3
4
...
5
6
    try {
7
        10/0;
8
    } catch (ErrorException $e) {
9
        Yii::warning("Division by zero.");
10
    }
11
    
12
...

La respuesta del catch de arriba es para generar una advertencia para el registro. Yii tiene un extenso control de registros:

  • Yii::trace(): registra un mensaje para trazar como un fragmento de código se ejecuta. Principalmente para desarrollo.
  • Yii::info(): registra un mensaje que lleva información acerca del evento.
  • Yii::warning(): registra un mensaje  de advertencia de que un evento inesperado ha ocurrido.
  • Yii::error(): registra un error fatal para su investigación.

Si, en lugar de registrar un evento, deseas dirigir al usuario a la pagina de error que configuramos anteriormente, puedes lanzar una excepción con el evento:

1
use yii\web\NotFoundHttpException;
2
3
throw new NotFoundHttpException();

Aquí esta un ejemplo donde lanzamos una excepción con un código de estado HTTP especifico y un mensaje personalizado:

1
  try {
2
          10/0;
3
      } catch (ErrorException $e) {
4
        throw new \yii\web\HttpException(451,
5
            'Tom McFarlin\'s humor is often lost on me

6
                (and lots of people).');
7
    }

Aquí esta como el código se ve para el usuario:

Yii2 Error Handling and Exceptions Throw an exceptionYii2 Error Handling and Exceptions Throw an exceptionYii2 Error Handling and Exceptions Throw an exception

Acerca del registro de Yii

Todos los errores en Yii son registrados dependiendo de como los has configurado. También puede interesarte mi tutorial sobre Sentry y Rollbar para el registro en Yii:

En Conclusión

Espero que hayas disfrutado nuestra exploración del manejo de errores y excepciones. Revisa nuestros próximos tutoriales en nuestra serie Programando Con Yii2 mientras continuamos profundizando en diferentes aspectos del framework.

Si te gustaría ver algo mas profundo en el desarrollo de aplicaciones en Yii, revisa nuestra serie Construye Tu Startup Con PHP la cual usa las plantillas avanzadas de Yii2. En ella se cuenta la historia de como programamos cada paso del Meeting Planner. Es bastante útil si quieres aprender sobre construir aplicaciones en Yii desde los cimientos.

Si te gustaría saber cuando saldrá el próximo tutorial de Yii2, sígueme @lookahead_io en Twitter o revisa mi pagina de instructo

Enlaces Relacionados

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.