El "ON" es para filtrar el tipo de excepción, cuando se quiere dar una respuesta diferente para ciertos tipos. Así:
Código Delphi
[-]
...
EXCEPT
ON Error: EDatabaseError DO
ShowMessage ('Error en la base de datos. ¡A saber lo que estabas buscando!');
ON Error: EInOutError DO
ShowMessage ('¡Error de entrada y salida! Chungo lo tienes');
ON Error: Exception DO
ShowMessage ('La excepción no es de entrada y salida ni de base de datos. Aun así, no respires tranquilo');
END;
Además te permite acceder a los métodos de la excepción, tales como el identificador, el mensaje, etc.
También ten en cuenta que cada bloque filtrará la excepción indicada y todas aquellas de clases derivadas que no hayan sido procesadas ya. Por eso "ON Error: Exception " obtendrá todas las excepciones que no se hayan filtrado. Y por eso es importante el orden en el que se pongan, ya que se pueden ocultar si se ponen en el orden incorrecto (por ejemplo, si pones "ON Error: Exception " la primera, entonces nunca ejecutará el resto).
De todas formas, puedes anidar un "FINALLY" dentro del "EXCEPTION":
Código Delphi
[-]
TRY
query1.open;
TRY
edit1.text := query1.fieldbyname ('CAMPO').asstring ;
FINALLY
query1.close ;
END;
EXCEPT
On Error: EDatabaseError DO
ShowMessage ('Error al cargar los datos: '+Error.Message);
ON Error: Exception DO
ShowMessage ('Excepción: '+Error.Message);
END;