lunes, 11 de abril de 2011

[TALLER] Manejo de eventos, excepciones y errores

En esta entrada mostrare las excepciones en mi proyecto y una breve descripción del porqué se utilizan.

Exception:

public Database(){
  try{
   Class.forName(drv);
   ct =DriverManager.getConnection(db, user, pword);
   st =ct.createStatement();
   System.out.println("Conección exitosa.");
  }catch(Exception e){
   System.out.println("No se pudo conectar a la base de datos.");
  }
 }

En el código anterior se muestra un constructor utilizado para hacer conexión con la base de datos. Todo el código va dentro de un "try" y después un "catch" con una excepción y un mensaje al usuario.

La excepción es del tipo Exception ya que se utiliza la clase Class que solo puede aceptar un tipo de excepción general.

SQLException:

public void showAll(String matt, String pass) {
  String dia = new String();
  Scanner a = new Scanner(System.in);
  System.out.println("Introduzca un dia (Lu, Ma, Mi, Ju, Vi, Sa): ");
  dia = a.next();
  dayselection = dia;
  try{
   do{
    stmt = ct.prepareStatement("SELECT * FROM Alumnos, "+dia+" WHERE  Alumnos.idAlumnos = ? AND Alumnos.idPass = ? AND Alumnos.idAlumnos = "+dia+".idAlumnos");
    stmt.setString(1,matt);
    stmt.setString(2, pass);
    rs = stmt.executeQuery();
    if(rs.next()){
     System.out.println("Seleccione Horario: ");
     String sub = a.next();
     System.out.println(rs.getString(sub));
     subselection=rs.getString(sub);
     fill_data();
     rs.close();
    }
    else{
     System.out.print("Error");
     rs.close();
    }
   }while(rs.isClosed()==false);
  }catch(SQLException e){
   System.out.println("No se pudo realizar la consulta.");
  }
 }

En el código anterior se muestra un método para obtener información de una base de datos a partir de un usuario y una contraseña. Todas las consultas de SQL deben de ir en un try y acompañadas de un catch. En este caso es una excepción del tipo SQLException, que provee información sobre algún error de conexión a la base de datos, en este caso manda al usuario un mensaje de error diciendo que no se pudo conectar a la base de datos.

public void fill_data(){
  try{
   stmt = ct.prepareStatement("SELECT * FROM "+subselection+", "+dayselection+" WHERE "+dayselection+".idAlumnos = "+subselection+".idAlumnos");
   rs = stmt.executeQuery();
   while(rs.next()){
    for(int i=2; i<=9; i++){
     phrs(i);
     if(rs.getString(i) == null){
      System.out.println("Sin Datos");
     }
     else{
      System.out.println(rs.getString(i));
     }
    }

   }
  }catch(SQLException i){
   System.out.println("No tiene materia asignada en ese horario.");
  }
 }

En este caso sucede lo mismo ya que se desea realizar una consulta, este método se encarga de mostrar materias habiendo introducido un horario, de haber un error en la consulta, significa que no existe una materia en el horario seleccionado, de haber cualquier otro tipo de error, el programa jamas habría llegado a este punto.

IOException:
public static void main(String[] args) throws IOException{
  
  boolean selec=true;
  Horario h = new Horario();
  
  Console terminal = System.console();
        if (terminal==null ) {
            System.err.println("No puedo obtener la consola.");
            return;
        }
  String mat = new String (terminal.readLine("Ingresar Usuario: "));
  String pass= new String (terminal.readPassword("Ingresar contraseña: "));
  while(selec == true|| selec ==true){
   h.showAll(mat, pass);
   System.out.print("¿Desea ver otra materia?(S/N): ");
   char sel= (char) System.in.read();
   
    switch(sel) {
    case 's': 
     selec = true;
        break;
        
    case 'S':
     selec=true;
     break;
    
    default:
     selec = false;
        break;
   }
   
   
  }
 }

Existe otra forma de expresar un error, lanzando directamete una excepción sin un try y catch. Este es el método main, y la palabra seguida "throws" que significa lanza, que literalmente lanza una excepción de tipo IOException, es utilizada para mostrar información de errores de entrada y salida.

En este caso, la clase Console siempre debe de ser acompañada de este tipo de excepciones, ya que si se ejecuta el programa desde un lugar distinto de la consola, este lanzara un mensaje de error.

6 comentarios:

Roberto Martínez dijo...

Puedes poner bastantes excepciones en tu proyecto, por ejemplo:
- Cuando el salón ya esta lleno
- Cuando ya tienes una hora ocupada por otra materia
- Cuando no debes de llevar la materia por semestre
- Cuando no debes de llevar la materia por créditos.

Por mencionar algunas.
Espero que te sea de ayuda :)

Victor Alejandro dijo...

Bueno es que mi programa solo te da informaciòn sobre tus materias actuales, pero con el nuevo tema tratare de implementar lo que me falta(envio de notas, creaciòn de horarios y eventos sociales).

Lo que si es que existen muchas formas de aplicar excepciones. Tan solo coloque las que utilizo en lo que llevo de proyecto.

Saludos!

Cecilia Urbina dijo...

También en tu programa debes de tener muchos eventos ya que será un programa para alumnos entonces debe de tener una interfaz lo más agradable posible, además que será la manera en que interactues con el usuario :D

Androidsc3 dijo...

Hola que tal podrías también agregar una excepción de que las hora no corresponde ala materia seleccionada otra excepción también en la opción que tendrá tu programa de agregar tareas de que marque un excepción si se empalma la hora

Saludos (:

Victor Alejandro dijo...

@Cecy: si lo se, pero no me quiero acomplejar el codigo por ahora como para agregar interfaz, para eso utilizare mis vacaciones ;)

@Alex: esque se supone que las materias se muestran dependiendo de a hora seleccionada, y las tareas pues para eso implementare las notas, para que el usuario reciba mensajes de todos, incluyendo maetros, asi se mantiene informado.

Elisa dijo...

Roberto, Cecy & Alex +1. Estoy de acuerdo que falta platicar bastante sobre los eventos. Tampoco hay mucho sobre errores. La entrada tal cual vale 3.

Vic: para el miércoles 4 necesito las entradas de pruebas unitarias y sistemas distribuidos.

Publicar un comentario