| Creación de un Televisor estándar |
| Paso 19: Ejemplo en pseudocódigo Java |
Imaginemos que un Hospital tiene dos aplicaciones distintas que quieren utilizar unas librerías de bajo nivel reutilizables
- una de estas aplicaciones es utilizada por el personal de Atención al Cliente del Hospital
- entre sus tareas está la de dar de alta pacientes en el Hospital
- el personal que utiliza esta aplicación tiene conocimientos informáticos a nivel usuario y trabaja en un entorno Windows
- la otra aplicación es utilizada por personal que trabaja en el Centro de cálculo del Hospital realizando labores de explotación del Sistema
- entre sus tareas está la de dar de alta usurios que van a utilizar el Sistema en el Hospital
- el personal que utiliza esta aplicación es informático y trabaja en un entorno Unix
Según este planteamiento se ve claro que si hay algún problema a la hora de realizar sus labores, la forma de mostrar el problema será diferente
- al personal de Atención al Cliente se le mostrará un cuadro de diálogo de Windows explicando el error de una forma entendible para un usuario no informático
- al personal realizando labores de explotación se le mostrará en una linea de comando de la shell de Unix el error con un nivel de detalle sólo entendible por personal informático
Para reflejar la forma de tratar excepciones en Java vamos a utilizar el siguiente pseudocódigo:
Esta es la Clase AplicacionAtencionCliente que utiliza el personal de Atención al Cliente del Hospital
package paqhospital;
import
utilidades.ficheros.MantenimientoFichero;
public class AplicacionAtencionCliente {
public static void main(String[] args) {
AplicacionAtencionCliente apliHospital = new AplicacionAtencionCliente();
apliHospital.ingresarPaciente();
}
public void ingresarPaciente(){
try {
MantenimientoFichero.añadirRegistroFichero(nombreFichero, datosPaciente);
}
catch(FicheroNoEncontradoException fnee) {
// aqui se muestra en un cuadro de diálogo un mensaje indicando por ejemplo
// un número de error y que se pongan en contacto con el servicio técnico
}
catch(NoAbrirException nae) {
// aqui se muestra en un cuadro de diálogo un mensaje indicando por ejemplo
// un número de error y que se pongan en contacto con el servicio técnico
}
catch(NoEscrituraException nee) {
// aqui se muestra en un cuadro de diálogo un mensaje indicando por ejemplo
// un número de error y que se pongan en contacto con el servicio técnico
}
catch(EntradaSalidaException ese) {
// aqui se muestra en un cuadro de diálogo un mensaje indicando por ejemplo
// un número de error y que se pongan en contacto con el servicio técnico
}
finally {
if (nombreFichero != null) {
nombreFichero.close();
}
}
}
}
|
- AplicacionAtencionCliente apliHospital = new AplicacionAtencionCliente();
- se crea una instancia de la Clase AplicacionAtencionCliente
- apliHospital.ingresarPaciente();
- se realiza una llamada al método ingresarPaciente()
- public void ingresarPaciente() {
- se declara el método ingresarPaciente()
- try {
MantenimientoFichero.añadirRegistroFichero(nombreFichero, datosPaciente);
}
- se realiza una llamada a un método estático llamado añadirRegistroFichero(...) que pertenece a una Clase de utilidades para cuestiones de código de bajo nivel de tratamiento de ficheros
- como la invocación al método añadirRegistroFichero(...)es susceptible de devolver un error o excepción nos protegemos con el bloque try
- catch(FicheroNoEncontradoException fnee) {
- si el fichero no se encontrara en el sistema se lanzaría esta excepción y se trataría en este punto
- el quid de la cuestión está en que nosostros estamos escribiendo código en una Clase llamada AplicacionAtencionCliente que está pensada para un tipo de usuario concreto (personal de atención al cliente) y por lo tanto es aquí donde podremos comunicarnos con este tipo de usuario de la forma más clara y concisa para él
- una vez se ha tratado esta excepción, el flujo del programa saltará al bloque finally
- catch(NoAbrirException nae) {
- si no se pudiera abrir el fichero, se lanzaría esta excepción
- catch(NoEscrituraException nee) {
- si el fichero resultara ser sólo de lectura, se lanzaría esta excepción
- catch(EntradaSalidaException ese) {
- si el fichero estuviera en un medio de almacenamiento removible, como un disco duro conectado al puerto USB, y lo desconectáramos del ordenador justo en el momento que se está escribiendo el registro, entonces se lanzaría esta excepción
- finally {
if (nombreFichero != null) {
nombreFichero.close();
}
}
- como este bloque se ejecuta siempre, entonces preguntamos si la variable nombreFichero está apuntando a un fichero.
- en caso afirmativo, entonces se cierra el fichero
Esta es la Clase AplicacionExplotacion que utiliza el personal de Sistemas y Explotación del Hospital
package paqhospital;
import utilidades.ficheros.MantenimientoFichero;
public class AplicacionExplotacion {
public static void main(String[] args) {
AplicacionExplotacion apliExplotacion = new AplicacionExplotacion();
apliExplotacion.añadirNuevoUsusarioAlSistema();
}
public void añadirNuevoUsusarioAlSistema() {
try {
MantenimientoFichero.añadirRegistroFichero(nombreFichero, datosUsuario);
}
catch(FicheroNoEncontradoException fnee) {
// aqui se muestra en una línea de comando un mensaje indicando por ejemplo
// un número de error y detalles de bajo nivel sobre las causas del error
}
catch(NoAbrirException nae) {
// aqui se muestra en una línea de comando un mensaje indicando por ejemplo
// un número de error y detalles de bajo nivel sobre las causas del error
}
catch(NoEscrituraException nee) {
// aqui se muestra en una línea de comando un mensaje indicando por ejemplo
// un número de error y detalles de bajo nivel sobre las causas del error
}
catch(EntradaSalidaException ese) {
// aqui se muestra en una línea de comando un mensaje indicando por ejemplo
// un número de error y detalles de bajo nivel sobre las causas del error
}
finally {
if (nombreFichero != null) {
nombreFichero.close();
}
}
}
} |
- AplicacionExplotacion apliExplotacion = new AplicacionExplotacion();
- se crea una instancia de la Clase AplicacionExplotacion
- apliExplotacion.añadirNuevoUsusarioAlSistema();
- se realiza una llamada al método añadirNuevoUsusarioAlSistema()
- public void añadirNuevoUsusarioAlSistema(){
- se declara el método añadirNuevoUsusarioAlSistema()
- try {
MantenimientoFichero.añadirRegistroFichero(nombreFichero, datosUsuario);
}
- se realiza una llamada a un método estático llamado añadirRegistroFichero(...) que pertenece a una Clase de utilidades para cuestiones de código de bajo nivel de tratameineto de ficheros
- como la invocación al método añadirRegistroFichero(...)es susceptible de devolver un error o excepción nos protegemos con el bloque try
- catch(FicheroNoEncontradoException fnee) {
- si el fichero no se encontrara en el sistema se lanzaría esta excepción y se trataría en este punto
- el quid de la cuestión está en que nosostros estamos escribiendo código en una Clase llamada AplicacionExplotacion que está pensada para un tipo de usuario concreto (personal inforrmático de Sistemas y Explotación) y por lo tanto es aquí donde podremos comunicarnos con este tipo de usuario de la forma más clara y concisa para él
- una vez se ha tratado esta excepción, el flujo del programa saltará al bloque finally
- catch(NoAbrirException nae) {
- si no se pudiera abrir el fichero, se lanzaría esta excepción
- catch(NoEscrituraException nee) {
- si el fichero resultara ser sólo de lectura, se lanzaría esta excepción
- catch(EntradaSalidaException ese) {
- si el fichero estuviera en un medio de almacenamiento removible, como un disco duro conectado al puerto USB, y lo desconectáramos del ordenador justo en el momento que se está escribiendo el registro, entonces se lanzaría esta excepción.
- finally {
if (nombreFichero != null) {
nombreFichero.close();
}
}
- como este bloque se ejecuta siempre, entonces preguntamos si la variable nombreFichero está apuntando a un fichero
- en caso afirmativo, entonces se cierra el fichero
Esta es la Clase MantenimientoFichero de bajo nivel que ha sido realizada por un equipo de desarrollo sin saber de antemano en que entorno concreto se va a utilizar. Esta Clase va a ser reutilizada, es decir utilizada por diferntes aplicaciones en diferentes contextos
package utilidades.ficheros;
public class MantenimientoFichero {
public static void añadirRegistroFichero(File fichero1, Vector datos) throws
FicheroNoEncontradoException,
NoAbrirException,
NoEscrituraException,
EntradaSalidaException {
encontrarFichero(fichero1);
abrirFichero(fichero1);
comprobarFicheroEscritura(fichero1);
escribirRegistro(fichero1, datos);
}
private static void encontrarFichero(File fichero1) throws
FicheroNoEncontradoException {
// aqui se busca el fichero fichero1
}
private static void abrirFichero(File fichero1) throws NoAbrirException {
// aqui se abre el fichero fichero1
}
private static void comprobarFicheroEscritura(File fichero1) throws
NoEscrituraException {
// aqui se comprueba si el fichero fichero1 es de escritura
}
private static void escribirRegistro(File fichero1) throws
EntradaSalidaException {
// aqui se añade un registro al fichero fichero1
}
}
|
- public static void añadirRegistroFichero(File fichero1, Vector datos) throws
FicheroNoEncontradoException,
NoAbrirException,
NoEscrituraException,
EntradaSalidaException {
- como éste es un método de bajo nivel y no sabe que aplicaciones lo van a invocar
- en vez de tratar este método directamente las excepciones, las lanza (throws) al método que ha hecho la invocación para que sea éste último quien las trate
- encontrarFichero(fichero1);
abrirFichero(fichero1);
comprobarFicheroEscritura(fichero1);
escribirRegistro(fichero1, datos);
- el método añadirRegistroFichero(...) realiza diferentes invocaciones a otros métodos
- private static void encontrarFichero(File fichero1) throws
FicheroNoEncontradoException {
// aqui se busca el fichero fichero1
}
- este método lanza una excepción porque este no es el contexto adecuado para tratarla
- lo mismo sucede con el resto de métodos invocados por el método añadirRegistroFichero(...)