Newsgroup: it.comp.lang.visual-basic
Titolo: [.NET] Gestione eccezione.

Ciao a tutti,
come vedete qualcuno posta ancora :-)
Sino ad oggi ho usato le eccezioni, nel modo più semplice possibile.
Ho un DB MySql ed EF 4.1 .
Quando vado ad invocare il metodo "SaveChanges", inserito in un blocco Try Catch, l'eccezione scatenata è la seguente
=====================
System.Data.Entity.Infrastructure.DbUpdateException: Errore durante l'aggiornamento delle voci. Per ulteriori informazioni, vedere l'eccezione interna. ---> System.Data.UpdateException: Errore durante l'aggiornamento delle voci. Per ulteriori informazioni, vedere l'eccezione interna. ---> MySql.Data.MySqlClient.MySqlException: Duplicate entry '0010' for key 'Unica'
   in MySql.Data.MySqlClient.MySqlStream.ReadPacket()
   in MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int64& insertedId)
   in MySql.Data.MySqlClient.Driver.GetResult(Int32 statementId, Int32& affectedRows, Int64& insertedId)
   in MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force)
   in MySql.Data.MySqlClient.MySqlDataReader.NextResult()
   in MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
   in MySql.Data.Entity.EFMySqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
   in System.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute(UpdateTranslator translator, EntityConnection connection, Dictionary`2 identifierValues, List`1 generatedValues)
   in System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter)
   --- Fine della traccia dello stack dell'eccezione interna ---
   in System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter)
   in System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options)
   in System.Data.Entity.Internal.InternalContext.SaveChanges()
   --- Fine della traccia dello stack dell'eccezione interna ---
   in System.Data.Entity.Internal.InternalContext.SaveChanges()
   in Gommista.Data.Collection.Controller.Save() in E:\Programmazione\Gommista_3\Data\Collection\Controller.vb:riga 19
=====================
Sin qui è tutto ok, dal momento che mi segnala che sto tentando di duplicare una voce in un campo "unico". L'eccezione però è generica. Come posso capire a runtime che tipo di eccezione rappresenta, così da poter avvisare l'utente con un messagebox appropriato (del tipo "La voce inserita è già presente in archivio") ?
Grazie in anticipo.

Scusate, dimenticavo l'eccezione che lancio:
 
        Public Sub Save()
            Try
                _context.SaveChanges()
            Catch ex As Exception
                MsgBox(ex.ToString())
            End Try
        End Sub

 Ho un DB MySql ed EF 4.1 .
[CUT]
 
In un costrutto Try puoi specificare pi� clausole Catch, ricordandoti di 
lasciare il catch pi� generico come ultima istruzione altrimenti quelle 
specifiche non vengono mai eseguite.
 
Non conosco il namespace MySql quindi ti faccio un esempio (banale) per 
SQL Server:
 
           Public Sub Save()
               	Try
                 	_context.SaveChanges()
		Catch ex As SQLException
             		If ex.Number = 2627 Or ex.Number = 2601 Then
                 		MessageBox.Show("You attempted to 	enter  a duplicate 
Key", "Dupicate Computer Tag", MessageBoxButtons.OK, MessageBoxIcon.Warning)
                 		Return 1
             		End If
               	Catch ex As Exception
                   	MessageBox.Show(ex.ToString(), MessageBoxButtons.OK, 
MessageBoxIcon.Warning))
               	End Try
           End Sub
 
Ciao, Vincenzo
 

Ciao Vincenzo,
mi sto giusto studiando un po' il namespace MySql, ma pare che esistano solo eccezioni generiche. Anche nel testo dell'eccezione, non compare alcun codice identificativo (tu hai la proprietà "Number"). Per ora ho risolto con una schifezza, cioè analizzando il contenuto del messaggio e se trovo la stringa "duplicate", nel MessageBox comparirà il messaggio adeguato.
 
Ora invece mi si è sollevato un altro problema...
L'unico momento in cui la mia app può rendersi conto che si sta tentando di duplicare una voce, è quello del .SaveChanges. Se però qualcosa va storto (come nel mio caso), la transazione di EF rimane in sospeso, inficiando tutte le operazioni successive.
Sto leggendo trattarsi di un problema noto e ho trovati alcuni metodi di caching. Però mi pare impossibile che non si possa gestire agevolmente un'eccezione plausibile come questa.
Ogni suggerimento è gradito.