PDA

Ver la Versión Completa : Dudas con Try/Except en código


Caray
13-12-2006, 21:10:21
Que tal gente de este foro, el presente mensaje es para ver si me pueden despejar una duda en cuanto a un código que tengo.
El código me sirve para abrir un pequeño documento de ayuda hecho en Word (dada una ruta) y si no está en la ruta especificada me manda una pequeño mensajillo, a continuación está el codigo:

procedure Tfrmdatos_personales.AyudaClick(Sender: TObject);
var
Word : Olevariant;
begin
Word := CreateOleObject('Word.Application');

try
Word.Documents.Open('E:\CARAY\Caray Word\ayuda.doc');
Word.Visible := True;
except
on EOleException do
MessageDlg('El Archivo de Ayuda no se Encontró en la Ruta Especifícada.', mtInformation,[mbOk], 0);
end;

end;

En lo que quiero que me ayuden es en decirme si hicé bien en utilizar el try/except puesto que leí algo donde dice que casi nunca utilice esto. Esa es mi duda.
Esperando su respuesta me despido no sin antes agradecerles el favor de su atención.

Caral
13-12-2006, 21:16:41
Hola Caray
Mas bien lo que yo he visto es que si se tiene que usar, y que ayuda en la ejecucion del programa, reduciendo el tiempo entre otros.
Yo siempre que puedo y me acuerdo, lo uso.
Saludos

dec
13-12-2006, 22:35:08
Hola,

Lo que no queda claro es para qué utilizar el "try ... except" en este caso. Siempre puedes comprobar antes que el archivo a abrir exista realmente. La función "FileExists" puede servirte. En cuanto al tratamiento de la supuesta excepción indicas en un mensaje al usuario que el archivo no existe, pero, ¿"EOleException" significará eso realmente?

Tal vez sí, no he tratado mucho con objetos "OLE", pero, ya digo, en este caso, si se trata de averiguar si un archivo existe, no veo para qué dejar que se produzca una excepción, puesto que podemos comprobar previamente si el archivo existe o no. Tal vez sea menester el bloque "try ... except", pero, por otros motivos. ¿No?

rcarrillom
13-12-2006, 22:48:49
Hola a todos.
La estructura está bien y de hecho se debe de usar, con una observación personal de la linea
on EOleException do
ésta especifica qué tipo de excepción en particular se debe manejar. No estoy familiarizado con el uso de Word mediante OLE, pero intuyo que el origen de la excepción podría ser por ejemplo que no esté instalado el Office, la falta de memoria para abrir el archivo ya sea por tener poca RAM o tener abiertas muchas apps, que el .doc esté corrupto, que el doc se encuentre en una ubicación de la red no accesible, etc, no solamente que no exista el documento en disco, tu bloque de control de error asume que esa es la única razón. Reitero, no estoy familiarizado on el OLE, pero yo recomendaría buscar la manera de saber exactamente si el origen de la excepción es efectivamente que no exista el doc.

En mi lógica de programación usaría este flujo:
1. Comprobar si está instalado Word.
2. Usar la función de Delphi FileExists para saber si existe el archivo.
3. Crear el objeto OLE y continuar normalmente.[/FONT]

Espero que mi comentario haya sido útil.

AzidRain
13-12-2006, 22:59:56
Yo creo que es innecesario en este caso usar el try, ya que se supone que el espíritu de las excepciones es que el programa pueda solucionar u ofrecer un alternativa de solución al problema que generó la excepción y de esta forma seguir funcionando sin caerse.

En este caso particular de nada nos sirve el mensaje ya que no soluciona nada para el usuario, es más me doy cuenta que lo usas para mostrar una ayuda al usuario abriendo word....y si el usuario no tiene Word?... tu código fallará desde la primera instrucción y ahi si no capturas la excepción por lo que en ese caso el usuario solo verá un bonito mensaje críptico.

Soluciones:
1.- No uses word solo para mostrar una ayuda...Un richedit te puede servir mas o menos igual
2.- Verifica que tanto word como el archivo de ayuda esten disponibles antes de tratar de hacer nada con ellos en el código

consejo:
Los try son útiles y necesarios por ejemplo cuando creas objetos al vuelo para asegurarlos que si ocurre un error se destruya correctamente el objeto..también para asegurarnos que dejemos la aplicación como estaba hasta antes de que ocurriera el error.
Para liberar objetos...

Miventana := TForm.Create(nil);
Try
MiVentana.ShowModal;
//..Hacemos algo con MiVentana
//.
//.
finally
MiVentana.Free; //Si ocurriera un error en el codigo entre "try" y "finally"
end; // Miventana siempre se destruye correctamente


para dejar las cosas como las encontramos...

//Vamos a ejecutar un proceso que tarda un poco
Screen.cursor:=crHourglass; // Ponemos el relojito...
Try
//..Hacemos algo que tarde mucho y pueda fallar
//.
//.
finally
Screen.Cursor := crArrow; // Si ocurrio un error de todos modos
end; // dejamos el cursor nuevamente como estaba


Ejemplo anterior pero tratando la excepcion

//Vamos a ejecutar un proceso que tarda un poco
Screen.cursor:=crHourglass; // Ponemos el relojito...
Try
Try
//..Hacemos algo que tarde mucho y pueda fallar
//.
//.
except
//Corregimos el error o informamos que no se pudo corregir
end;

finally
Screen.Cursor := crArrow; // Si ocurrio un error de todos modos
end; // dejamos el cursor nuevamente como estaba

Caray
15-12-2006, 04:47:01
Bueno compañeros gracias por las respuestas dadas, me hace mucho bien sus puntos de vista.
La verdad es que yo soy un novato en delphi leo algo cuando tengo chance, el obejtivo del código era mostrar el mensaje dado en Except si no se encontraba el archivo en la ruta dada, es decir, si la ayuda esta en el directorio C y movido pues queria mostrar este mensaje.
Pero de todos modo gracias, por sus puntos de vista.