Ver Mensaje Individual
  #11  
Antiguo 15-07-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Reputación: 28
jachguate Va por buen camino
Hola.

Lucasarts nos ha dado un buen ejemplo de uno de los errores mas comunes a la hora del uso de try/except.

Cita:
Empezado por lucasarts_18
Código Delphi [-]
procedure TFrmTag.btnAplicarClick(Sender: TObject);
var
cont,i : Integer;
begin
cont := FrmArchivos.LstBoxFile.Items.Count;
   for i := 0 to cont - 1 do
      if FrmArchivos.LstBoxFile.Selected[i] = True then
      try
      begin
         FrmPowerM.mp3Tag.Title := edtTitulo.Text;
         FrmPowerM.mp3Tag.artist := edtArtista.Text;
         FrmPowerM.mp3Tag.Album := edtAlbum.Text;
         FrmPowerM.mp3Tag.Genre := edtGenero.Text;
         FrmPowerM.mp3Tag.Year := edtAno.Text;
         FrmPowerM.mp3Tag.SaveTagToFile(FrmArchivos.LstBoxFile.Items.Strings[i]);
      end
      except
         ShowMessage('Para cambiar el tag de un archivo,éste no debe estar ejecutandose');
      end;
end;
El problema, es que (hablando en términos de marteens) el plan "B" que intenta aplicarse es específico de un tipo de problema, pero se termina aplicando para cualquier condición de excepción, lo cual no siempre será adecuado, tal como lo ilustra el ejemplo actual.

Supongamos por ejemplo, que la propiedad Year, aún cuando es de tipo string, valida que el valor asignado sea un número. La forma "normal" de "romper un contrato" (sigo con marteens) es elevar una excepción, dado que este no se ha cumplido al asignar la cadena "mil novecientos noventa y cinco" a la propiedad year (lo introducido por el usuario). En este caso la excepción será de la clase EConvertError.

En este caso, el usuario segirá recibiendo el mensaje: Para cambiar el tag de un archivo,éste no debe estar ejecutandose

Esto no orienta en nada al usuario a corregir su error. Hay que tomar en cuenta también que hay otra serie de excepciones que podrian ocurrir: El disco está lleno, quizas tenga sectores dañados. En windows no es inusual que el sistema se quede sin recursos... también podria ocurrir una guerra nuclear y el usuario obtendría siempre el mismo mensaje .

Esto nos lleva a la situación mas general de comprender que podrá ocurrir una serie de condiciones de excepción para la que no estamos preparados. La regla general es entonces aplicar el "plan b" solo para aquellas que sabemos y queremos tratar, dejando pasar todas las demás.

Código Delphi [-]
procedure TFrmTag.btnAplicarClick(Sender: TObject);
var
  cont,i : Integer;
begin
  cont := FrmArchivos.LstBoxFile.Items.Count;
  for i := 0 to cont - 1 do
    if FrmArchivos.LstBoxFile.Selected[i] = True then
    try
      FrmPowerM.mp3Tag.Title := edtTitulo.Text;
      FrmPowerM.mp3Tag.artist := edtArtista.Text;
      FrmPowerM.mp3Tag.Album := edtAlbum.Text;
      FrmPowerM.mp3Tag.Genre := edtGenero.Text;
      FrmPowerM.mp3Tag.Year := edtAno.Text;
      FrmPowerM.mp3Tag.SaveTagToFile(
        FrmArchivos.LstBoxFile.Items.Strings[i]);
    except
      on EFileInUse do
        ShowMessage('Para cambiar el tag de un archivo, éste no debe estar ejecutandose');
    end;
end;

Suponiendo que el método elevará la exepción EFileInUse. Ahora, cualquier otra condición de error seguirá abortando la ejecución del código hasta que haya un bloque que si sepa que hacer con ella.

Cita:
Empezado por lucasarts_18
Yo siempre utilizo Try...Except, no sé para que sirve el raise..alguien sabe??
raise es la instrucción con la que se eleva una exepción. Si se usa dentro de un bloque except, reeleva la misma excepción que nos hizo entrar alli.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita