Como te comentan los demás es la mejor opción para controlar errores, yo lo utilizo en los lugares, donde hay errores por causas externas, anexo ejemplo del try, ademas, te anexo la funcion mostrarMensajeError() para guardar el error en un archivo txt, por si el usuario no sabe explicar que error fue,
LPROCESAR = .F. &¶ controlar si se produjo un error
If LPROCESAR = .F.
Procedure mostrarMensajeError(titulo,oError)
* uso =mostrarMensajeError("Error actualizando los datos",oError)
Local msj, causa, solucion, M.numerror, M.tab, M.consulte, M.contador,nomprog, lcnombre_usuario
*Set Step On
Store "" To M.msj, M.causa, M.solucion, lcnombre_usuario
*If !Pemstatus(_Screen, "MiToolbar", 5)
If !Pemstatus(_Screen, "MiToolbar.Container1.TEXT1.value", 5)
lcnombre_usuario ="El usuario no se ha validado"
Else
lcnombre_usuario = _Screen.MiToolbar.Container1.TEXT1.Value
Endif
nomprog = _Screen.softname && nombre del programa
m.numerror = oError.ErrorNo
m.tab = " "
m.consulte = "Consulte con su administrador del sistema."
m.msj = oError.Message+Iif( .Not. Empty(Sys(2108)), " ("+Sys(2108)+")", "")
If Empty(M.solucion)
m.solucion = M.consulte
Endif
**Aqui se muestra el mensage de error
?? Chr(7)+Chr(7)
=Messagebox(titulo+Chr(13)+;
oError.Message+Chr(13)+;
"Error #:"+Transform(oError.ErrorNo)+Chr(13)+;
"Linea #:"+Transform(oError.Lineno)+Chr(13)+;
"Contenido #:"+Transform(oError.LineContents)+Chr(13)+;
"Procedimeinto:"+oError.Procedure+Chr(13)+;
"Detalle :"+oError.Details+Chr(13)+;
"StackLevel :"+Transform(oError.StackLevel)+Chr(13)+;
m.consulte+Chr(13)+;
"--------------"+Chr(13),48,"Error")
**aqui guardamos los datos en el archivo texto
*Pop Key All
Clea Typeahead
Set Console Off
Set Printer Off
Set Printer To
Clea Typeahead
Do While .Not. Empty(Inkey())
Enddo
Clea Typeahead
Set Console Off
If M.numerror<>6
If File(_Screen.Ruta_WorkingDirectory+"ERROR_TAB.TXT")
Set Alternate To (_Screen.Ruta_WorkingDirectory+"ERROR_TAB.TXT") Additive
Else
Set Alternate To (_Screen.Ruta_WorkingDirectory+"ERROR_TAB.TXT")
Endi
Set Alternate On
Endif
?
? Replicate("*", 60)
? "Programa ................:", Alltrim(_Screen.softname)
? "Empresa .................:", Alltrim(_Screen.empresa) &&NOMBRE DE LA EMPRESA
? "Versión .................:", _Screen.Version &&version del progrma
? "Usuario .................:", lcnombre_usuario
? "Fecha y hora ............:", Datetime()
?
? "Error número ........... :", Ltrim(Str(m.numerror)), ":", M.msj
If Message(1)<> Message()
? "Orden errónea ...........:", Message(1)
Endif
If .Not. Empty(Ferror())
? "Error de bajo nivel .....:", Ltrim(Str(Ferror()))
Endif
? "Error Linea .............: ", Transform(oError.Lineno)
? "Contenido ...............: ", Transform(oError.LineContents)
? "Procedimeinto ...........: ", oError.Procedure
? "Detalle .................: ", oError.Details
? "StackLevel...............: ", Transform(oError.StackLevel)
?
? "Alias seleccionado ......:", Alias()
? "Filtro ..................:", Filter()
? "Directorio de trabajo ...:", _Screen.Ruta_WorkingDirectory
? "Directorio de temporales :", Sys(2023)
?
? "Programas en ejecución"
? "--------------------------------------------------------"
If Type("_screen.activeform") = "O" And Type("_screen.activeform.activecontrol") = "O"
?
Endif
If Type("_screen.activeform") = "O" And Type("_screen.activeform.activecontrol") = "O"
? "Objeto actual ...........:"+Sys(1272, _Screen.ActiveForm.ActiveControl)
?
Endif
For x = 1 To 128
If Empty(Program(x))
Exit
Endi
? Program(x)
Endf
?
Set Alternate Off
Set Alternate To
Clos Alternate
Set Console Off
*=msg("El programa se detendra debido al error mostrado anteriormente, favor contacte al administardor del sistema.")
*If Type('If Type('_Screen.ActiveForm')='o'')='O'
* _Screen.ActiveForm.Release()
*Endif
Endproc