Autore Topic: [risolto]Personalizzare i CATCH  (Letto 1047 volte)

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
[risolto]Personalizzare i CATCH
« il: 13 Dicembre 2010, 22:48:48 »
ciao raga

stasera ho perso ore per capire un errore mismatch in quanto il cursore non si fermava sull'errore per i vari CATCH  presenti nel programma.

è possibile personalizzare i CATCH  tipo:

CATCH
   Message.Error(Form, riga, Error.text)
« Ultima modifica: 14 Dicembre 2010, 21:48:03 da dex »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Personalizzare i CATCH
« Risposta #1 il: 14 Dicembre 2010, 12:51:12 »
Mica ho capito cosa intendi per "personalizzare"...

Comunque, attenzione a come metti le istruzioni CATCH, se si annidano su più funzioni/metodi, tipo matrioska, potresti avere problemi di intercettabilità dei bug e di lettura generale del codice.

In genere, i metodi o funzioni di basso livello, non contengono istruzioni di cattura degli errori, che viene demandata alle funzioni/metodi di livello superiore specializzato.

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Personalizzare i CATCH
« Risposta #2 il: 14 Dicembre 2010, 21:18:19 »
Esiste l'oggetto Error che contiene alcune proprietà, tra cui Error.Text che contiene il messaggio dell'ultimo errore e Error.Where che contiene il punto in cui si è verificato oltre ad Error.Code che contiene il codice.

Potresti provare con:
Codice: gambas [Seleziona]
Message.Error("Errore " & Error.Code & " a " & Error.Where & ": " & Error.Text)
Visita il mio sito personale: http://www.leonardomiliani.com

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
Re: Personalizzare i CATCH
« Risposta #3 il: 14 Dicembre 2010, 21:47:32 »
Esiste l'oggetto Error che contiene alcune proprietà, tra cui Error.Text che contiene il messaggio dell'ultimo errore e Error.Where che contiene il punto in cui si è verificato oltre ad Error.Code che contiene il codice.

Potresti provare con:
Codice: gambas [Seleziona]
Message.Error("Errore " & Error.Code & " a " & Error.Where & ": " & Error.Text)


perfetto era proprio quello che cercavo

grazie leo

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
Re: [risolto]Personalizzare i CATCH
« Risposta #4 il: 14 Dicembre 2010, 22:50:40 »
ho risolto per gli errori

ora ho aggiunto una sub per salvare l'errore in un file log.

solo che non riesco a caricare l'errore in una string senza interferire il il message.error.

se metto:
Citazione
CATCH     
 
 Message.Error("Codice " & Error.Code & " - Form/modulo " & Error.Where & " - Errore " & Error.Text)
 m1.ScriviLog("Codice " & Error.Code & " - Form/modulo " & Error.Where & " - Errore " & Error.Text)

mi visualizza l'errore ma nel log salva:
Citazione
Codice 0 - Form/modulo  - Errore

se inverto:
Citazione
CATCH     
 m1.ScriviLog("Codice " & Error.Code & " - Form/modulo " & Error.Where & " - Errore " & Error.Text)
 Message.Error("Codice " & Error.Code & " - Form/modulo " & Error.Where & " - Errore " & Error.Text)
 

nel log salva bene ma nel message mi da: Codice 0 - Form/modulo  - Errore

come faccio a salvare capra e cavoli?

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: [risolto]Personalizzare i CATCH
« Risposta #5 il: 14 Dicembre 2010, 23:02:38 »
Usa una variabile stringa a cui "affidi" il testo, che prima stampi e poi salvi.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
Re: [risolto]Personalizzare i CATCH
« Risposta #6 il: 14 Dicembre 2010, 23:08:50 »
Re Risolto con:

Citazione
CATCH 
  m1.MyErr = ("Codice " & Error.Code & " - Form/modulo " & Error.Where & " - Errore " & Error.Text)
 Message.Error(m1.MyErr)
 m1.ScriviLog(m1.MyErr)

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
Re: Personalizzare i CATCH
« Risposta #7 il: 14 Dicembre 2010, 23:20:18 »
Mica ho capito cosa intendi per "personalizzare"...

Comunque, attenzione a come metti le istruzioni CATCH, se si annidano su più funzioni/metodi, tipo matrioska, potresti avere problemi di intercettabilità dei bug e di lettura generale del codice.

In genere, i metodi o funzioni di basso livello, non contengono istruzioni di cattura degli errori, che viene demandata alle funzioni/metodi di livello superiore specializzato.

é proprio la caratteristica dei CATCH di annidarsi e di essere richiamati da altre funzioni, che a volte crea problemi per capire dove toppa il codice, d'altronde non se ne può fare a meno in fase di utilizzo del compilato.

Il programma compilato, se non viene gestito dai CATCH un banale errore sul database e diventa inutilizzabile, a volte si verificava quando io non ero presente e l'operatore non sapeva dirmi ne cosa stava facendo ne il tipo di errore, era un casino solo per capire dove poteva essere l'errore ho quale condizione lo aveva creato.

Cmq ora ho risolto sia con il message che mi dice (form, sub, riga e errore) sia con il file log che registra tutto, basta controllare il log per capire che succede.

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: [risolto]Personalizzare i CATCH
« Risposta #8 il: 15 Dicembre 2010, 10:27:39 »
Per continuare nella spiegazione fatta da leo, ricordo che l'oggetto Error viene aggiornato ogni qualvolta viene eseguita una qualsiasi istruzione.
Per spiegare le indicazioni di leo, l'utilizzo di una variabile per salvare lo stato di Error è obbligatorio, a causa del fatto che poi viene chiamato un metodo/funzione che obbliga l'interprete a gestire un qualsiasi errore che possa essere scatenzato dalla chiamata e, ovviamente, questo resetta i dati nell'oggetto statico Error.

Un appunto:
a suo tempo avevo studiato l'oggetto Error, in modo da gestire gli errori di un'applicazione da un unico punto, ovvero una classe specializzata a loggare gli errori, più o meno come fanno tutti gli altri linguaggi.
Purtroppo, l'implementazione di questa classe (Error) limita molto questa cosa...
Mi sono poi accorto che è possibile farlo solo con un'altro oggetto statico, ad esempio la classe Application, con cui è possibile definire dei metodi, altrettanto statici, a cui passare dei dati personalizzati di errore e, all'interno di questi, salvare e gestire le proprietà di Error, senza che queste vengano resettate dalla chiamata al metodo statico. In pgDesigner questa cosa è stata implementata, e successivi studi mi hanno permesso di creare anche classi specializzate nel logging (su file, a video, messaggi, ecc.).
L'unica cosa che non ho potutto fare è quella di concentrare la gestione degli errori applicativi in un solo punto, questo a causa della mancanza di alcune necessarie informazioni per poter ripristinare il corso applicativo (ovvero riprendere da dove si è fermato).