Uno de los caballos de batalla de la enseñanza de la programación es hacer ver a los alumnos que una de las funciones principales de los lenguajes es la de facilitar que se eviten errores. La tipificación y posterior comprobación de datos de los compiladores, por ejemplo, es un mecanismo que refleja dicha intención; al fin y al cabo, todas las variables se almacenan en memoria de igual forma, sin importar el tipo (más que para reservar el espacio), por lo que no es difícil darse cuenta de que el especificar que un tipo es entero, flotante o cadena es un modo de controlar los fallos en los lenguajes fuertemente tipados. De lo contrario, sólo habría que especificar cuántos bytes ocuparía la variable con la que queremos trabajar, y no su tipo.
Esto es extensible al tipo de las funciones y a sus parámetros. Así, si un parámetro es de tipo entero estamos indicando al compilador que nos avise si, por algún descuido, hemos permitido que la función reciba una cadena a través de dicho parámetro. No debe preocuparnos si además debe ser entero positivo, ya que la mayoría de los lenguajes admiten datos numéricos sin signo como tipos estándar. Sin embargo, los compiladores no son capaces de limitar que el valor del parámetro debe pertenecer a uno o varios rangos (por ejemplo, que el parámetro int iAge deba estar entre -1 y 150 [considerando -1 como "desconocido"]).
Una magnífica y eficiente práctica es cubrir esta limitación mediante programación de aserciones (invariantes, precondiciones y postcondiciones), donde una "aserción" es una condición indispensable que debe cumplir un valor para que el sistema pueda continuar ejecutándose. En el ejemplo anterior, la aserción debería cubrir el rango de edad, por lo que el cuerpo de la función contendría, nada más comenzar, una precondición similar a la siguiente:
Debug.Assert(iAge >= -1 && iAge <= 150,
Error.ImprimirFatal(Error.EError.RangoIncorrecto,
"iAge", "[-1,150]", iAge));
Otro tipo de aserciones comprueban cuándo un parámetro es nulo, cadena vacía, una conexión supuestamente abierta está cerrada, el usuario no está autenticado…
La alternativa a las aserciones es emplear condicionales y lanzar excepciones. Tanto uno como las otras suelen estar implementadas en los distintos lenguajes de programación como métodos cuyo primer parámetro es la condición a cumplir, el segundo es la acción en caso de que no se cumpla [1] y que, tras ejecutar ésta, automáticamente finalizan la ejecución de la aplicación.
[1] En este caso, el sistema invoca a un método que imprimiría algo parecido al resultado de procesar "Fatal: El valor " + iValor + " de la variable/parámetro '" + sVariable + "' debe estar en el rango " + sRango + ".".