# Errores y mensajes de error

## Errores en un programa

Los ordenadores no poseen inteligencia ni sentido común, se limitan a ejecutar las instrucciones contenidas en el programa. Por ello, los programas no pueden contener errores ni ambigüedades y tienen que tener previstos todas las posibles situaciones.

Algunos errores de programación no pueden ser detectados por los compiladores o intérpretes (por ejemplo, si un programa tiene que calcular una suma y el programador ha escrito una multiplicación en vez de la suma el programa no dará el resultado correcto pero el compilador no puede saberlo), pero otros sí. En esta lección se comentan los errores que detectan los compiladores o intérpretes, avisando al programador o al usuario de su existencia.

Podemos distinguir dos tipos de errores:

- Errores sintácticos (parse errors)

  Un programa debe estar escrito según las reglas del lenguaje de programación. Si un programa no cumple alguna regla, se dice que el programa tiene un error sintáctico.

- Errores no sintácticos (errors)

  Aunque un programa siga las reglas del lenguaje, el ordenador puede ser incapaz de ejecutar una instrucción determinada (dependiendo del error, el ordenador y de continuar con la ejecución del programa. En ese caso, se dice que el programa tiene errores no sintácticos.

Entre los errores no sintácticos, se pueden distinguir varios tipos de errores:

- Advertencias (warnings)

  El ordenador es incapaz de ejecutar una instrucción determinada, pero el ordenador puede continuar con la ejecución del programa. En ese caso, se dice que el compilador da advertencias.

- Avisos (notices)

  El ordenador es capaz de ejecutar una instrucción determinada, pero detecta que el programador puede haberse equivocado. En ese caso, se dice que el compilador da avisos. Los avisos no siempre son señales de equivocaciones, pero deben evitarse.

- Obsolescencias (deprecated / strict)

  El compilador puede detectar que un programa utiliza características del lenguaje que actualmente funcionan correctamente, pero que no estarán (o pueden no estar) disponibles en futuras versiones, y generar un aviso de obsolescencia.

A continuación se comentan algunos mensajes de error.

Volver al principio de la página

## Mensajes de error

Cuando PHP encuentra errores en un programa, PHP puede generar un mensaje de error que se incluye en la página en el punto en que se ha encontrado el error. El error incluye una descripción del error y el número de línea en el que PHP ha encontrado el error, lo que facilita al programador su corrección (el número de línea indica la línea en que PHP se da cuenta de que hay un error, pero el error puede estar en una línea anterior a la indicada por PHP).

La directiva error_reporting del fichero de configuración de PHP php.ini permite establecer qué tipos de error generarán un mensaje de error. Como se comenta en la lección de configuración de PHP:

- En un entorno de producción (es decir, en un servidor accesible a usuarios en Internet o en una red local) se recomienda que PHP no muestre mensajes de error al usuario, pues esos mensajes de error pueden ser aprovechados por usuarios maliciosos para sus propios fines (provocar la caída del servidor, obtener información privada, etc.).
- En un entorno de desarrollo (es decir, en un servidor utilizado por el programador o para probar el funcionamiento de la aplicación) se recomienda que PHP muestre el mayor número de errores posible, para tener conocimiento de ellos y corregirlos lo antes posible

Antes de ejecutar un programa, PHP analiza el programa en busca de errores sintácticos (llaves, paréntesis o comillas sin cerrar, etc). Un error sintáctico es un error fatal, que detiene el propio análisis y lo único que obtendremos será el mensaje de error. Si un programa contiene varias errores sintácticos, PHP sólo muestra el mensaje de error del primer error. Una vez corregido el primer error, al volver a ejecutar el programa se mostrará el mensaje del segundo error y así sucesivamente hasta corregir todos los errores sintácticos.

Si un programa no contiene errores sintácticos, PHP ejecuta el programa. Durante la ejecución del programa PHP puede encontrar un error que impida la ejecución del resto del programa o encontrarse con un error que no impida la ejecución del programa. En el primer caso, el navegador mostrará el contenido de la página generado hasta el error, el mensaje de error y nada más. En el segundo caso, el navegador mostrará el contenido de la página completo, con el mensaje de error insertado en el lugar en el que se produjo (dependiendo de la estructura de la página, el mensaje de error puede ser visible únicamente en el código fuente).

Por supuesto, que un programa no genere mensajes de error no significa que el programa funcione correctamente, pero si genera mensajes de error probablemente no funcionará correctamente.

Volver al principio de la página

## Errores sintácticos (Parse errors)

Un programa está formado por las palabras reservadas del lenguaje, cadenas, variables, constantes o funciones, paréntesis, llaves, corchetes, signos de puntuación, operadores, etc, que además deben sucederse en un orden determinado. Los errores sintácticos se producen cuando el compilador no encuentra los símbolos (tokens) esperados o encuentra otros en su lugar.

En el manual de PHP se encuentra la lista de palabras reservadas (keywords), la lista de constantes predefinidas, la lista de clases predefinidas y la lista de tipos de símbolos (tokens).

Cuando encuentra un símbolo no esperado, PHP indica el tipo de símbolo que ha encontrado sin esperarlo.

- unexpected character

      <?php
      print <p>Hola</p>
      ?>
      Parse error:  syntax error, unexpected '<' in prueba.php on line 2

  En este caso, el motivo del error es que un trozo de texto debe estar contenido en una cadena (rodeado por comillas simples o dobles) y cuando encuentra el carácter < (que representa el operador matemático de desigualdad), no puede entenderlo como tal.

- unexpected T_CONSTANT_ENCAPSED_STRING

      <?php
      primt "<p>Hola</p>";
      ?>
      Parse error:  syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in prueba.php on line 2

  En este caso, el motivo del error es que primt no es una palabra reservada del lenguaje ni una función (debería decir print) y cuando encuentra la cadena no sabe cómo seguir.

- unexpected T_PRINT

      <?php
      print "<p>Hola</p>"
      print "<p>Adios</p>"
      ?>
      Parse error:  syntax error, unexpected T_PRINT in prueba.php on line 3

  En este caso, el motivo de error es que la primera sentencia no finaliza en punto y coma (;) y no se esperaba el segundo print. Por cierto, la última sentencia de un bloque php puede no finalizar en punto y coma, aunque se recomienda hacerlo.

Los paréntesis, llaves y corchetes deben estar emparejados (por cada signo abierto debe hacer uno cerrado).

- final inesperado

      <?php
      $edad = 15;
      if ($edad<19) {
          print "<p>Menor de edad</p>";
      ?>
      Parse error:  syntax error, unexpected $end in prueba.php on line 5

  En este caso, el motivo de error es que no se ha cerrado la llave y PHP llega al final del fichero sin haber cerrado el bloque.

- paréntesis inesperado

      <?php
      $resultado = 2*3+4);
      print "<p>Resultado: $resultado</p>";
      ?>
      Parse error:  syntax error, unexpected ')' in prueba.php on line 2

  En este caso, el motivo de error es que no se ha abierto el paréntesis y PHP no se espera el paréntesis cerrado.

Volver al principio de la página

## Advertencias (Warnings)

Estos avisos indican que se ha producido un error de algún tipo que no impide la ejecución del resto del programa.

- división por cero

      <?php
      $numero = 0;
      $resultado = 1/$numero;
      print "<p>Resultado: $resultado</p>";
      ?>
      Warning:  Division by zero in prueba.php on line 3

      Resultado:

  En este caso, el motivo del aviso es que se intenta realizar un cálculo matemático imposible (dividir entre cero).

- uso de cabeceras después de escribir texto

      <?php
      print "<p>Hola</p>";
      header("location:index.php");
      exit();
      ?>
      Hola
      Warning:  Cannot modify header information - headers already sent by (output started at prueba.php:2) in prueba.php on line 3

  En este caso, el motivo del aviso es que se intenta enviar una cabecera después de haber enviado texto (dependiendo de la configuración de PHP, concretamente de la directiva output_buffering, puede no dar aviso de error).

Volver al principio de la página

## Avisos (Notices)

Los avisos no impiden la ejecución de un programa, pero son señal de malas prácticas de programación.

- variable no definida

      <?php
      print "<p>Edad: $edad</p>";
      ?>
      Notice:  Undefined variable: edad in prueba.php on line 2

      Edad:

  En este caso, el motivo del aviso es que se utiliza una variable a la que no se había asignado valor previamente. El programa funciona puesto que PHP le asigna el valor de cadena vacía, pero se desaconseja utilizar variables no establecidas previamente.

Volver al principio de la página

## Obsolescencias (Strict / Deprecated)

- función obsoleta

      <?php
      $cadena = 'ABC';
      if (eregi('a', $cadena)) {
          print "'$cadena' continene una 'a' o una  'A'";
      }
      ?>
      Deprecated:  Function eregi() is deprecated in prueba.php on line 3

      'ABC' continene una 'a' o una 'A'

  En este caso, el motivo del aviso es que la función eregi() está considerada obsoleta desde la versión PHP 5.3.0.

Volver al principio de la página

Esta obra está bajo una licencia de Creative Commons Reconocimiento-CompartirIgual 3.0 España.