Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Duda con Try... Except (https://www.clubdelphi.com/foros/showthread.php?t=84415)

danielmj 16-10-2013 18:36:18

Duda con Try... Except
 
Hola a todos de nuevo, saludos...

Estoy teniendo un pequeño problema con la función Try... Except, os pongo el código:

Código Delphi [-]
try
    principal.memo1.Lines.Add(CalcHash(principal.labedit1.Text,haSHA1));
    principal.Memo1.Lines.SaveToFile(principal.labEdit2.Text+ '\'+' Archivo Hash.crc');
  except
    on EFCreateError do
      begin
        showMessage ('Unidad seleccionada no valida. Selecciona una unidad' +
        chr(13)+'de disco duro local que sea accesible.');
        exit;
      end;
  end;

El problema aparece cuando por ejemplo selecciono una unidad de DVD que no tiene disco. Y lo que pasa es que antes de capturar el error y mostrar mi mensaje, me tira un mensaje de propio de delphi. Y mi duda es ¿cómo puedo hacer que solo salga mi mensaje de error sin mostrar ni antes ni después el mensaje de error de delphi?

Espero haberme explicado bien. Gracias y un saludo.

ecfisa 16-10-2013 20:19:56

Hola danielmj.

Intenta de este modo:
Código Delphi [-]
var
  Error: LongWord;
begin 
  Error := SetErrorMode(SEM_FAILCRITICALERRORS);
  try
    try
      principal.memo1.Lines.Add(CalcHash(principal.labedit1.Text,haSHA1));
      principal.Memo1.Lines.SaveToFile(principal.labEdit2.Text+ '\'+' Archivo Hash.crc');
    except
      raise Exception.Create('Unidad seleccionada no valida. Selecciona una unidad' +
        chr(13)+'de disco duro local que sea accesible.');
    end;
  finally
    SetErrorMode(Error);
  end;
...

Saludos :)

danielmj 16-10-2013 20:42:53

Buenas ecfisa,

andes de nada gracias por responder, acabo de probar tu código pero sigo con el mismo problema, de echo ahora ni tan siquiera muestra mi mensaje, simplemente se limita a mostrar 3 veces el mensaje interno de error de delphi.

De la otra forma, hay veces que va bien y otras no. :confused:

Saludos.

ecfisa 16-10-2013 21:58:59

1 Archivos Adjunto(s)
Hola.

Es extraño... Con DVD insertado o si él, no me muestra el mensaje de sistema, sólo el especificado en el código.

Por si te ayudara en algo, te adjunto la prueba que hice con Delphi 7 en Windows 8.

Saludos :)

danielmj 16-10-2013 22:55:46

Hola ecfisa,

acabo de probar el archivo adjunto que me has enviado y va perfecto, no sé por que usando el mismo codigo en mi aplicacion da error 3 veces... misterio. Lo miraré y estudiaré a ver que saco en claro.

Gracias y saludos.

mamcx 17-10-2013 00:46:57

Cita:

Empezado por ecfisa (Mensaje 468425)
Código Delphi [-]

    except
      raise Exception.Create('Unidad seleccionada no valida. Selecciona una unidad' +
        chr(13)+'de disco duro local que sea accesible.');
    end;

Saludos :)

No NO. Esta usando un except global!

Es mala idea capturar genericamente cualquier cosa y/o asumir que el error es "Unidad seleccionada no valida".

Que te hace pensar que esa es la REAL razon? La documentacion:

http://docwiki.embarcadero.com/Libra....EFCreateError

Cita:

EFCreateError is raised when an application unsuccessfully attempts to create a file. This can occur, for example, if a user specifies an invalid file name, or specifies the name of an existing file that cannot be overwritten because the user lacks appropriate access permission.
Muestra que puedan existir multiples causas.

Tu codigo EN NINGUN MOMENTO ESTA ASEVERANDO que la unidad seleccionada sea valida.

Osea, el mensaje es una contradiccion de lo que REALMENTE hace tu codigo.

Casimiro Noteví 17-10-2013 01:47:30

Cita:

Empezado por mamcx (Mensaje 468458)
No NO.

¿Cómo lo harías?

ecfisa 17-10-2013 03:40:38

Hola mamcx.

El texto es copia del mensaje de danielmj, mi intención no era darle la solución definitiva al problema sino sugerirle como evitar el mensaje del sistema con SetErrorMode, (además de mostrarle que podía evitar el uso de Abort).

A diario, son muchos los problemas que leemos e intentamos solucionar y a veces no podemos dedicarle a cada uno todo el tiempo que desearíamos ... :o

Saludos :)

ecfisa 17-10-2013 04:24:54

Hola de nuevo.

Saliéndome un poco del planteo inicial de danielmj...

Código Delphi [-]
...
procedure TForm1.FormCreate(Sender: TObject);
var
  Device  : DWORD;
  U  : string;
  i  : Integer;
begin
  Device := GetLogicalDrives;
  for i := 1 to 32 do
    if Device shr i and 1 = 1 then
    begin
      U:= Chr(Ord('A') + i) + ':';
      if GetDriveType(PChar(U)) in [DRIVE_REMOVABLE, DRIVE_FIXED] then
        ComboBox1.Items.Add(U);
    end;
  ComboBox1.ItemIndex := 0;
end;


function DriveReady(Drv: string): Boolean;
var
  MaxLen, SysFlags: DWORD;
  SNumber: DWORD;
  OldErr,Error : DWORD;
  Msg   : string;
begin
  OldErr := SetErrorMode(SEM_FAILCRITICALERRORS);
  try
    if GetVolumeInformation(PChar(Drv+'\'),nil,0,@SNumber,MaxLen,SysFlags,nil,0) then
     Result:= True
    else
    begin
      Error := GetLastError;
      case Error of
          ERROR_INVALID_NAME       : Msg := 'Nobre de archivo, de directorio o etiqueta de volumen inválido';
          ERROR_PATH_NOT_FOUND     : Msg := 'Ruta no encontrada';
          ERROR_TOO_MANY_OPEN_FILES: Msg := 'Demasiados archivos abiertos';
          ERROR_ACCESS_DENIED      : Msg := 'Acceso denegado';
          ERROR_WRITE_PROTECT      : Msg := 'Unidad protegida contra escritura';
          ERROR_NOT_READY          : Msg := 'La unidad no esta lista';
          ERROR_NOT_DOS_DISK       : Msg := 'El disco especificado no puede ser accedido';
          ERROR_HANDLE_DISK_FULL   : Msg := 'Disco lleno';
          ERROR_INVALID_DRIVE,
          ERROR_BAD_UNIT           : Msg := 'No se puede encontrar la unidad especificada';
          // ...
       end;
       raise Exception.Create(Msg);
    end;
  finally
    SetErrorMode(OldErr);
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  if DriveReady(ComboBox1.Text) then
  begin
    // Guardar contenido del Memo
  end;
end;

Para contemplar mas errores revisa: System Error Codes

Saludos :)

danielmj 21-10-2013 23:20:54

Hola, pregunta desde mi ignorancia... en mi proyecto, supuestamente si selecciono una unidad no válida (por que no sea accesible), me captura el error y me muestra el mensaje, pero solo contemplo ese error, entonces ¿sería acertado cubrir todos los posibles errores o con mostrar el "unidad no valida" es suficiente? Aclaro que el proyecto simplemente se centra en coger un archivo de 15Gb (ejemplo) y cortarlo en trozos para luego unirlo.

Ahora mismo muestra el mensaje de error si por ejemplo a la hora de unir los trozos selecciono la unidad de CD y no hay disco, pero como digo solo contemplo ese error en concreto.
Saludos.

ecfisa 21-10-2013 23:57:43

Cita:

Empezado por danielmj (Mensaje 468766)
Hola, pregunta desde mi ignorancia... en mi proyecto, supuestamente si selecciono una unidad no válida (por que no sea accesible), me captura el error y me muestra el mensaje, pero solo contemplo ese error, entonces ¿sería acertado cubrir todos los posibles errores o con mostrar el "unidad no valida" es suficiente?

Hola Daniel.

Depende de la profundidad de la información que vos consideres que el usuario debería conococer para dar solución al problema. En mi opinión el punto es que, sea por H o sea por B, no se puede guardar el archivo. Así un mensaje que exponga de forma simple el problema, a veces es mas sencillo de entender para el lector no avezado.

Por ejemplo algo como:
Cita:

ERROR AL INTENTAR GUARDAR EL ARCHIVO.
Revise que haya un disco insertado y que haya espacio en el mismo.
Si el error persiste controle el correcto funcionamiento del disco o la unidad.
De ese modo el que está ingresando los datos hará lo que está a su alcance para corregirlo y si no puede, llamará a quién corresponda

Por mas que nuestro mensaje indique cada posible error incluyendo el número (como pa' no errarle :D), de nada sirve si quién lo lee no puede interpretarlo.

Es decir, un empleado que solo carga datos en un programa de gestión y no tiene ni la más remota idea del funcionamiento de S.O. quedaría bastante confundido con mensajes como: "Error, acceso denegado", "Error, manejador inválido", ... (y me consta que de esos empleados hay)

Saludos. :)

danielmj 22-10-2013 18:45:50

hola ecfisa,

entiendo supongo que tambien iran en funcion del tipo de usuario final, es decir, no tiene sentido dar grandes detalles de errores y sus causas y soluciones sobre una aplicacion que como es el caso de mi proyecto (cortar y unir archivos) que va dirigida a un publco determinado y digamos que no es un soft de gestion o de cierta complicacion sobre todo cuando los pocos errores que pueda dar, son los de acceso a dispositivo.

Saludos


La franja horaria es GMT +2. Ahora son las 10:15:42.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi