se metti una cath in una funzione questa è valida solo all' interno di quella funzione o al limite anche all' interno di altre funzioni richiamate dalla funzione stessa.
a me il cath piace anche perche lo utilizzo per scrivere all' interno di un file log l' errore , inoltre se eseguo delle scritture con db inizializzate con un begin , in caso di errore non fa il commit e mi fa un roolback cancellandomi anche eventuali altre scritture precedenti che siano sempre all' interno del begin , ma a me piaciono anche le variabili globali , ammesso che per variabili globali intendiamo la stessa cosa tu per variaili globali cosa intendi?
inoltre non capisco cosa ti serva il try nella open della connessione ,dovresti sapere già a priori che in una parte di funzione la connessione e aperta ed in altre no
Sarà perché quando ho provato, tempo fa, la CATCH dentro un'struzione d'accesso al DB per registrare un nuovo record o altro, adesso non ricordo, ho avuto la sgradita sorperesa di vederla attivare anche in un passo di programma, interno alla stessa form, senza averne richiesto l'uso. Allora l'ho interpretata come malfunzionante e da quel momento mi sono ben guardato dall'usarla. Io non uso il file di log per risalire all'errore, ma sempre e soltanto MessageBox.
Ai primi approcci con Gambas ho usato l'istruzione di controllo try nelle open di una connessione perché utilizzavo male le query sql. Ora sono un pò più sicuro, ma utilizzo ancora la try nelle istruzioni di scrittura record nel DB, perché altrimenti, in caso di errore il programma s'interrompe con l'emissione di messaggi forniti da Gambas, quindi, al di fuori del controllo da parte del programma stesso. Perciò trovo più comodo e pertinente mantrenere tutto sotto il controllo del mio codice. Es.:
ApriDB = NEW OpenDB
i_id += 1
TRY OpenDB.DB_Connection.EXEC("INSERT INTO piancont VALUES(" & i_id & ", '" & Int(Val($_RgTbDump[0])) & "', '" & $_RgTbDump[1] & "', '" & $_RgTbDump[2] & "', '" & Int(Val($_RgTbDump[3])) & "')")
IF ( ERROR ) THEN
Message.ERROR("Attenzione! ERRORE --> '" & ERROR.Text & "'" & Chr(10) & "alla riga " & Error.Where & Chr(10) & Chr(10) & "durante la registrazione della '" & OpenDB.$_DbNome & "!piancont'" & Chr(10) & Chr(10) & Space$(30) & " IL PROGRAMMA VERRÀ CHIUSO")
QUIT
ENDIF
Come puoi notare, la presenza di ERROR.Text e di Error.Where mi permettono di catturare l'errore in forma chiara con l'indicazione della riga di programma dove l'errora possa manifestarsi.
Cosa intendo per variabili globali? Non capisco la domanda perché credo di non avere dubbi in proprosito, ma non ho niente in contrario a rispondere alla tua domanda: considerato che le variabili locali sono dichiarate con l'istruzione DIM all'interno di una procedura, tutte le altre, siano esse PRIVATE o PUBLIC, sono variabili globali. Occorre però conoscere l'estensione della loro efficacia, per cui una variabile Public|Privata, dichiarata all'inizio di una classe o modulo, è riconosciuta ed accessibile intanto all'interno di tutta la classe o di tutto il modulo; però la variabile dichiarata come PUBLIC può essere acceduta anche da qualsiasi altra classe o qualsiasi altro modulo del progetto e resta attiva per tutta la durata del programma stesso.
Spero di avere risposto bene alla prova d'esame.
Se ho sbagliato il concetto, ti prego di correggermi. Comunque tornando al mio intendimento di eliminare le variabili globali dal mio programma, intendo dire che ho eliminato tutte le variabili definite a suo tempo PUBLIC all'interno di uno dei moduli che conteneva il programma e che richiamavo di volta in volta con una sintassi del tipo: Modulo1.Variabile1. Per la loro peculiarità mi sembra sprecato tenerle attive per tutta la durata del prgramma, quando le utilizzo soltanto saltuariamente.
Sono entrato nell'ottica del risparmio di memoria, il più possibile, ed ho deciso di farne a meno da ora in avanti.