A diferencia de las aserciones referidas en entradas previas, las excepciones sí son esperadas durante la ejecución, si bien son infrecuentes y no se sabe cuándo aparecerán. Otra diferencia con las aserciones es que las excepciones son (o deben ser) disparadas por fuentes externas al programa y no controlables por el programador.
También es frecuente utilizarlo para el control de variables de entrada en métodos públicos y que pueden ser invocados desde la interfaz de usuario:
public void SaveVehicle(string sPlate, string sBrand){
if (sPlate == null ||
sPlate == '')
throw new ArgumentException(Error.Message(
Error.EError.EmptyValue,
"sPlate"));
if (sBrand == null || sBrand == '')
throw new
ArgumentException(Error.Message(
Error.EError.EmptyValue,
"sBrand"));
[…]
}
Esta solución está supeditada a que el método sea público: si el método es privado, se da por hecho que los valores usados para invocarlo han sido depurados y, por tanto, se utilizarían aserciones.
Por último, debe recordarse que las excepciones se utilizan para controlar comportamientos no esperados y que rompen el orden de ejecución natural de un proceso. No deben utilizarse para controlar el flujo esperado del programa. Por ejemplo, al encontrar un carácter de fin de archivo esperado no ha de lanzarse una excepción para cerrar el archivo, al ser esto parte natural del proceso; un condicional es más correcto y óptimo.