Gestione Errori - AccessGroup.it 2.0
Transcript
Gestione Errori - AccessGroup.it 2.0
Gestione Errori - AccessGroup.it 2.0 Scritto da SV Salvino Crucitti Venerdì 05 Maggio 2006 00:00 - Ultimo aggiornamento Mercoledì 28 Aprile 2010 10:58 Uno degli aspetti più importanti nello sviluppo di un'applicazione consiste nella previsione degli errori che possono verificarsi e nella successiva pianificazione di essi. Può capitare durante l'esecuzione di un'applicazione che accadano degli eventi che non possono essere previsti o evitati. Ad esempio che vengano accidentalmente cancellati dei record, che il collegamento con il server di rete cada inaspettatamente o che ci sia il tentativo di eseguire un'azione impossibile e non valida. In questi casi accadranno degli errori rilevabili solo in fase di esecuzione. Per gestirli è necessario aggiungere un codice alle procedure per la gestione degli errori. Gli errori in Access a grandi linee sono di due tipi: gli errori di sintassi e gli errori di esecuzione. Mentre per il primo tipo di errore, che avviene solo nella fase di scrittura di una procedura in un modulo e che è rilevabile tramite la compilazione del codice, il secondo avviene durante l'esecuzione dell'aplicazione. A questo ci riferiamo e per prevenirlo aggiungeremo alla nostra applicazione la gestione degli errori. A seconda della posizione dell'errore abbiamo queste possibilità: 1) Aggiungere il codice nell'evento "On Error" della maschera o report; 2) Inserire una istruzione On Error e il codice di gestione degli errori nella procedura. In entrambi i casi è necessario identificare con il codice di errore corrispondente l'errore che si vuole gestire. Generalmente si dichiara una costante che rappresenta il codice di errore e si fa riferimento all'errore tramite la costante. Per visualizzare i codici di errore bisogna creare una Tabella degli errori che contenga tutti i codici di errore e i messaggi ad essi associati. Nota E' bene sempre riferirsi al codice dell'errore e non alla descrizione dell'errore per evitare problemi con la versione di Access o con la localizzazione. Con la seguente procedura si crea la tabella degli errori di VBA: Sub GeneraTabellaErroriVBA() 'Genera tabella errori VBA Dim DB As DAO.Database Dim TabErr As DAO.TableDef Dim rst As DAO.Recordset Dim codErr As Long Dim strErrore As String Set DB = CurrentDb Set TabErr = DB.CreateTableDef("TabellaErroriVBA") With TabErr .Fields.Append .CreateField("CodiceErrori", dbLong) .Fields.Append .CreateField("StringaErrore", dbText) End With 1/5 Gestione Errori - AccessGroup.it 2.0 Scritto da SV Salvino Crucitti Venerdì 05 Maggio 2006 00:00 - Ultimo aggiornamento Mercoledì 28 Aprile 2010 10:58 DB.TableDefs.Append TabErr Set rst = DB.OpenRecordset("TabellaErroriVBA", dbOpenTable) For codErr = 1 To 1000 On Error Resume Next DoCmd.Hourglass True strErrore = Error(codErr) If strErrore <> "" Then If strErrore <> "Errore definito dall'applicazione o dall'oggetto" Then rst.AddNew rst("CodiceErrori") = codErr rst("StringaErrore") = strErrore rst.Update End If End If Next codErr rst.Close DoCmd.Hourglass False MsgBox "Tabella errori creata" End Sub Nota Nell'help in linea trovi il codice in ADO Con quest'altra quella di Access e del Jet: Sub GeneraTabellaErrori_A_J() 'Genera tabella errori Access/Jet Dim DB As DAO.Database Dim TabErr As DAO.TableDef Dim rst As DAO.Recordset Dim codErr As Long Dim strErrore As String Set DB = CurrentDb Set TabErr = DB.CreateTableDef("TabellaErrori_Acc_Jet") With TabErr .Fields.Append .CreateField("CodiceErrori", dbLong) 2/5 Gestione Errori - AccessGroup.it 2.0 Scritto da SV Salvino Crucitti Venerdì 05 Maggio 2006 00:00 - Ultimo aggiornamento Mercoledì 28 Aprile 2010 10:58 .Fields.Append .CreateField("StringaErrore", dbText) End With DB.TableDefs.Append TabErr Set rst = DB.OpenRecordset("TabellaErrori_Acc_Jet", dbOpenTable) For codErr = 1 To 32767 On Error Resume Next DoCmd.Hourglass True strErrore = AccessError(codErr) If strErrore <> "" Then If strErrore <> "Errore definito dall'applicazione o dall'oggetto" Then rst.AddNew rst("CodiceErrori") = codErr rst("StringaErrore") = strErrore rst.Update End If End If Next codErr rst.Close DoCmd.Hourglass False MsgBox "Tabella errori creata" End Sub Nota Nell'help in linea trovi il codice in ADO L'istruzione On Error Gli errori di esecuzione del VBA possono essere gestiti aggiungendo una istruzione On Error e un codice di gestione degli errori alle procedure. E' noto che se utilizziamo l'Autocomposizione per una qualche procedura evento Access automaticamente include una istruzione On Error e i codici della gestione degli errori. Supponiamo di creare un pulsante con l'autocomposizione a cui associamo l'apertura di una maschera. Private Sub Comando0_Click() On Error GoTo Err_Comando0_Click 3/5 Gestione Errori - AccessGroup.it 2.0 Scritto da SV Salvino Crucitti Venerdì 05 Maggio 2006 00:00 - Ultimo aggiornamento Mercoledì 28 Aprile 2010 10:58 Dim stDocName As String stDocName = "Maschera1" DoCmd.OpenForm stDocName Exit_Comando0_Click: Exit Sub Err_Comando0_Click: MsgBox Err.Description Resume Exit_Comando0_Click End Sub Nel codice dell'esempio On Error attiva la gestione degli errori. Se si verifica un errore il controllo della procedura salta all'etichetta di riga Err_Coma ndo0_Click: che sta ad indicare l'inizio del codice della gestione degli errori. Il primo rigo è un messaggio che visualizza la stringa del messaggio di errore. Dopo si passa alla successiva istruzione Resume che ci permette di uscire dal codice di gestione dell'errore passando a Exit_Comando0_Click: che con l'istruzione Exit Sub ci fa uscire dalla procedura Comando0_Click. Se non si verificano errori, vengono eseguite tutte le righe della procedura fino all'istruzione E xit Sub e pertanto il codice della gestione degli errori che succede ad Err_Comando0_Click: non viene eseguito. Resume o Resume Next Schematicamente abbiamo questa differenza: 4/5 Gestione Errori - AccessGroup.it 2.0 Scritto da SV Salvino Crucitti Venerdì 05 Maggio 2006 00:00 - Ultimo aggiornamento Mercoledì 28 Aprile 2010 10:58 L'utilizzo di a Supponiamo partire dall'istruzione che èargomento quello, l'ha generato, pertanto di mentre effettuare una correzione, riprendendo lamobile Resume Next consente che l'ha generato. il 0 prosieguo del codice senza correggere eduna eseguire nuovamente il procedura codice diversi diverso numeratore otterrà l'errore da ed eResume ilroutine di ilErroriAccessJet denominatore denominatore voler gestire Se poi la èsono 0 divisione ilThen si numeratore entrambi verificherà tra 0 non l'errore e5numeri. sil'errore è": effettua numerico [Divisione Sappiamo potrano divisione per che zero], essere se a mentre ilvirgola numeratore visualizzati se il èsi Function DivNumb(Num As Long, Denom As Long) As Variant On Error GoTo GestErr 'Nella tabella leggo i impostazione codici 'Divisione zero =6gestione 'Overflow 6[Overflow]. 'Chiamata di o11 non valido =l'istruzione Num /= Denom Exit Function GestErr: If Err =la 11 Or Err Or Err = 5passa DivNumb =per Null Else MsgBox "Errore non previsto " &due Err & " &possono Error Ifmessaggi. Resume Next End Function Nel codice sopra descritto notiamo tre passaggi: della 1) Attivazione procedura in della caso di errore. errori Notiamo e che del punto da cui continuare l'esecuzione On Error errori e indirizza alla attiva la gestione degli [GestErr] procedura 2) attivato. Codice in gestione un certo degli momento errori che risponda al codice a tutti getione gli errori degli che errori, si l'intercettazione prevedere. dell'errore Selabel ladi Il codice gestione degli errori utilizza l'istruzione del tipo If..Then..Else che verifica il valore Err ,è che a sua volta restituisce il codice dell'errore del VBA. 3) Uscita del codice di gestione degli errori. In questo passaggio l'istruzione Resume Next passa questo il caso controllo della procedura all'istruzione successiva a quella in cui è avvenuto l'errore: Function .Exit L'istruzione Resume Next che l'operazione inizi nuovamente. èeutilizzata anche nel caso indell'istruzione cui si effettua un ciclo einAccess si desidera Gli imprevisti On Error attiva l'intercettazione degli errori. L'uscita della procedura o On Error Go To disattiva esecuzione, degli errori l'intercettazione. non ma sia una attivato. intercettazione Quando una può intercettazione essere attiva anche è attiva se c'è tutto una il parte codice di di codice intercettazione che è0va inin Per momento ritroso gestione messaggio Supponiamo ns. e comodità cerca errori sospese. e l'esecuzione in che di B le avere si e Se chiamiamo poi trova. avviene una in verrà A, Se procedura non A, un in interrotta. B, questo errore esiste C. che Se nella percorso alcun Se è richiami in invece C esecuzione codice e non a una attiviamo ritroso esiste gestione seconda la sarà una C, una errori la eseguito e gestione gestione questa A e Access la B il richiami errore codice sono errori esce con della una fuori quel terza. prima con a un On Error l'esecuzione continuerà da quel punto e poi l'esecuzione Resume o Next ci permetterà di gestire secondo questi criteri: a) Con Resume A include un codice si di fa gestione una chiamata errori attivo alla procedura contenente che segue nel percorso. In questo caso se Resume procede chiamando B. l'esecuzione b) Next eseguita. In questo caso l'esecuzione se A include torna un codice alla successiva di gestione istruzione errori attivo dell'ultima contenente istruzione Resume Next l'esecuzione ritorna all'istruzione successiva alla chiamata alla procedura B. gestione imprevisti. Ricordiamo errori che attivato l'istruzione e non nella eseguita procedura si trova in sempre cui avviene nella l'errore. procedura Questo dove per c'è evitare il codice degli di Utilizzando Resume errore è tra quelli non previsti. può accadere In aiuto che ci viene una procedura la clausola venga eseguito all'infinito se l'ultimo Else. Nota versione ad 32767, aumentare. per Invengono MS evitare Access Perdefiniti conflitti generare nonnuovi con vengono errori future errori, personalizzati utilizzati versioni. pertanto tuttiil numero iconviene codici didei errore iniziarne codicia di disposizione. laerrore numerazione interni Inèogni dal destinato numero SEO by Artio 5/5