Hola,
En primer termino hay que ver como te conectas con la BD.
Si por ejemplo usas SQLSTRINGCONNECT esta función retorna un valor positivo con el número de conexión o bien -1 si no pudo conectar
si retorna valor negativo debes apelar a la función AERROR() para obtener el error
cStringConn =...
nCon = SQLSTRINGCONNECT(cStringConn)
IF nCon < 0
AERROR(aErr)
MESSAGEBOX(aErr[2]) && muestra el mensaje de error
ENDIF
o sea, los errores por conexiones a BD por ODBC con SQLSTRINGCONNECT no interrumpen la ejecución del programa VFP en curso, sino que lo debemos controlar en forma explicita desde el código por el valor retornado, con lo cual no se puede aplicar TRY/CATCH en forma directa
Una alternativa es hacer una función de conexión genérica por ej MI_UDF_CONN y una función ThrowException para manejar que el error para ser capturado por TRY/CATCH de esta manera
**********
*
FUNCTION MI_UDF_CONN
LPARAMETERS cStringConn
LOCAL nCon
nCon = SQLSTRINGCONNECT(cStringConn)
IF nCon < 0
AERROR(aErr)
ThrowException(aErr[1],aErr[2])
ENDIF
RETURN nCon
ENDFUNC
**********
*
FUNCTION ThrowException
LAPARMETERS nCode, cMessage
LOCAL oErr
TRY
THROW
CATCH TO oErr
oErr.ErrorNo=nCode
oErr.MESSAGE=cMessage
THROW
ENDTRY
ENDFUNC
y el uso sería
TRY
cStringConn = ...
MI_UDF_CONN(cStringConn)
CATCH TO oErr
MESSAGEBOX(TRANSF(oErr.ErrorNo)+CRLF+oErr.MESSAGE+CRLF+oErr.PROCEDURE+'('+TRANSF(oErr.LINENO)+')')
ENDTRY
* Saludos