FoxPro/Visual FoxPro - Mensaje de error

 
Vista:
Imágen de perfil de Cristhian

Mensaje de error

Publicado por Cristhian (13 intervenciones) el 12/01/2017 13:56:24
Buen día
Soy un programador novato

Como puedo hacer para que en caso de producirse un error en tiempo de ejecución, no aparezca el mensaje de error generado por foxpro, sino un mensaje personalizado. Por ejemplo, ocurrió el error en cualquier formulario y aparezca el mensaje "Ha ocurrido un error del programa"

Saludos

Cristhian
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Cristhian

Mensaje de error

Publicado por Cristhian (13 intervenciones) el 14/01/2017 12:10:30
Gracias por sus respuestas
Leí la información pero no se como implementarla a mi programa, para que haga lo que yo quiero. Es que recién estoy comenzando en esto.

Podrían escribirme el código que debo poner?

adjunto el prg de mi sistema

1
2
3
4
5
6
7
8
9
10
11
SET EXCLUSIVE OFF
SET PATH TO c:\negoc\tablas
SET TALK OFF
 
SET DELETED ON
 
DO FORM menuppal
 
READ EVENTS
 
CLOSE DATABASES ALL
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 309
Bronce
Ha mantenido su posición en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

Mensaje de error

Publicado por Santiago (507 intervenciones) el 14/01/2017 03:08:51
Debes usar: on error
Busca la sintaxis con F1
Suerte.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Cristhian

Mensaje de error

Publicado por Cristhian (13 intervenciones) el 14/01/2017 12:10:57
Gracias por sus respuestas
Leí la información pero no se como implementarla a mi programa, para que haga lo que yo quiero. Es que recién estoy comenzando en esto.

Podrían escribirme el código que debo poner?

adjunto el prg de mi sistema

1
2
3
4
5
6
7
8
9
10
11
SET EXCLUSIVE OFF
SET PATH TO c:\negoc\tablas
SET TALK OFF
 
SET DELETED ON
 
DO FORM menuppal
 
READ EVENTS
 
CLOSE DATABASES ALL
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 1.011
Oro
Ha mantenido su posición en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

Mensaje de error

Publicado por Fidel José (643 intervenciones) el 15/01/2017 15:57:46
Las rutinas de control de errores se deben trabajar en cada PROCEDURE, Method o Event.
Un ejemplo. En este caso, las rutinas residen en un archivo PRG llamad "gralfunc.prg", que se abre en el inicio del programa con SET PROCEDURE TO \PROG\gralfunc.prg

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
PROCEDURE get_Reccount
*!*	---------------------------------
*!*	Cuenta los registros no borrados
*!*	de una tabla o cursor
*!*	---------------------------------
LPARAMETERS tcCursor
TRY
	LOCAL lnRecords,loex as Exception
	LOCAL ARRAY laCnt(1)
	lnRecords = 0
	SELECT CNT(*) ;
		FROM (m.tcCursor) ;
		WHERE !DELETED() ;
		INTO ARRAY laCnt
	IF _tally > 0
		lnRecords = laCnt[1,1]
	ENDIF
CATCH TO loex
	loex.UserValue = PROGRAM()
	ShowError(loex)
FINALLY
 
ENDTRY
RETURN m.lnRecords
ENDPROC
 
 
* Mostrar el error
*----------------------------------------------------
PROCEDURE ShowError
LPARAMETERS toExcep,tlNotShow,tcCaption
*-----------------------------------------------------
tcCaption=EVL(tcCaption,"Mensaje del Sistema")
SET HOURS TO 24
LOCAL lcMens
 
lcMens="Fecha "+TRANSFORM(DATETIME());
	+ Chr(13)+"Mensaje: "+toExcep.message;
	+ Chr(13)+"ErrorNo: "+TRANSFORM(toExcep.Errorno);
	+ Chr(13)+"Llamada: "+toExcep.Uservalue
IF _vfp.StartMode=0
	lcMens=lcMens+ Chr(13)+"Linea "+TRANSFORM(toExcep.lineno)
ENDIF
 
STRTOFILE(lcMens+ Chr(13)+REPLICATE("=",60)+ Chr(13),"Errors.log",1)
 
lcMens="Se ha producido un error:"+ Chr(13)+lcMens
IF !tlNotShow
	MESSAGEBOX(m.lcMens,0,m.tcCaption)
ENDIF
 
ENDPROC

Para aplicar TRY / CATCH / ENTRY debes tener en cuenta tres cosas, cuando menos:
1) No puedes colocar un RETURN dentro de las estructura
2) Si se produce un error, la ejecución saltará a CATCH (no se ejecuta lo que está entre la linea que da error y lo que sigue antes del CATCH) y se ejecutará lo que tenga la estructura CATCH. CATCH to loEx crea un objeto Excepcion que se pasa como parámetro a la rutina de notificación de errores (ShowError).
3) Si existe, la parte de la estructura FINALLY se ejecuta siempre (con error o sin error), por lo que se utiliza para limpiar lo que se necesite. Debes tener en cuenta que si se produce un error en FINALLY, dará un error de control de rutina. Pero también puedes anidar un TRY CATCH ENDTRY dentro de FINALLY.

Pongo otro ejemplo. En este caso se trata de un User Method de una Custom Class, llamado "CopiarArchivo". Este método utiliza Scripting.FileSystemObject para generar la copia.
En este ejemplo se utiliza la estructura FINALLY para limpiar los objetos creados y, si es necesario, mostrar un mensaje.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
LPARAMETERS tcFileSource , tcFolderTarget ,tlVerbose ,tlOverWrite
 
*!*	tcFileSource:	Path y Archivo a copiar
*!*	tcFolderTarget:	Carpeta de Destino
*!*	tlVerbose:		=.T., Muestra un mensaje de copia realizada
*!*	tlOverWrite:	=.T., No pregunta si el archivo ya existe
 
TRY
	LOCAL loFso as Object,loFile as Object, loEx as Exception,;
		lcFileTarget,lExito,lnMess
	lnMess=6
	loFso=NEWOBJECT("Scripting.FileSystemObject")
 
	IF EMPTY(tcFileSource) OR NOT loFso.FileExists(tcFileSource)
		tcFileSource=GETFILE()
		IF EMPTY(tcFileSource)
			lnMess=0
		ENDIF
	ENDIF
	IF NOT EMPTY(tcFileSource)
		*** Consulta el verdadero nombre del archivo a copiar ***
		loFile=loFso.GetFile(tcFilesource)
		tcFileSource=ADDBS(JUSTPATH(tcFileSource))+loFile.Name
 
		*********************************************************
 
		IF EMPTY(tcFolderTarget) OR NOT loFso.FolderExists(ADDBS(tcFolderTarget))
			tcFolderTarget=GETDIR(FULLPATH(""),"Carpeta de Destino","Copiando Archivos",64)
		ENDIF
 
		IF NOT EMPTY(tcFolderTarget)
			lcFileTarget=FORCEPATH(tcFileSource , tcFolderTarget)
 
			IF !tlOverWrite
				IF loFso.FileExists(lcFileTarget)
					lnMess=MESSAGEBOX(lcFileTarget+" ya existe."+_CR_;
						+"Desea Sobrecopiar?",4,PROGRAM())
				ENDIF
			ENDIF
 
			IF lnMess=6
				loFso.CopyFile(tcFileSource , ADDBS(tcFolderTarget))
				lExito = loFso.fileExists(lcFileTarget)
			ENDIF
		ELSE
			lnMess=0
		ENDIF
	ENDIF
CATCH TO loex
	loex.UserValue=PROGRAM()
 
	ShowError(loex)	&& rutina de errores
FINALLY
	loFile = null
	loFso = null
	IF tlVerbose AND VARTYPE(loex)#"O" AND lnMess=6
		MESSAGEBOX("Copia "+IIF(lExito,"Exitosa","Fallida"),0,PROGRAM())
	ENDIF
 
ENDTRY
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar