Newsgroup: it.comp.lang.visual-basic
Titolo: filosofia degli errori nelle classi

Buongiorno a tutti.
ho dei grossi dubbi strutturali su come gestire gli errori nelle
classi.
poniamo il caso classico di una classe che restituisce una connection
Imports System.Data.SqlClient
Public Class SomeEntity
    Private _Connection As SqlClient.SqlConnection
    Private _ConnectionString As String
    Protected ReadOnly Property Connection() As SqlConnection
        Get
            If _Connection Is Nothing Then
                Try
                    _Connection = New SqlConnection(_ConnectionString)
                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
            End If
            Return _Connection
        End Get
    End Property
   Public Sub Open()
        Try
            Connection.Open()
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
End Class
e nella form
Dim sConn As String
sConn = "Data Source=xx.xxx.xxx.xxx;I1nitial Catalog=db;User
Id=usrt;Password=pwd;"
Dim ea As New SomeEntity(sConn)
ea.Open()
voi come vi regolate per gestire l'errore?
a me pare brutto che la classe faccia vedore l'errore
non dovrebbe essere compito dello strato di presentazione?
 
ciao e grazie

 non dovrebbe essere compito dello strato di presentazione?
ovviamente si,  ma anche l'esempio è terribile spero sinceramente tu 
non abbia veramente una classe che gestisce le connessioni in quel 
modo.
Per la domanda in se dipende molto da chi gestisce lo starto di 
presentatione, o meglio lo strato superiore, e di quanto ti "fidi" di 
quello strato.
.m
-- 
Mauro Servienti
{C67C0157-5D98-4733-A75E-93CAEE4BADC8}
Microsoft MVP - Visual C# / MCTS
http://mvp.support.microsoft.com
blog @ 
http://milestone.topics.it
whynot [ at ] topics [ dot ] it

 non dovrebbe essere compito dello strato di presentazione?
Vedere? Vedere si!
ma potrebbe anche non essere auspicabile mostrarlo!
Io faccio ritornare un codice interno mio che poi decide lo strato
business cosa farne...difficilmente propago l'errore tal quale.
ad esempio
posso decidere che un errore codice 40 o "TimeoutConnessione"....possa
andare in loop per 3 volte prima di ordinare di mostrare un minaccioso
box rosso "Impossibile connettersi al server"
In sintesi
Dipende dal tipo di applicazione ....ma sopratutto dall'operatore che
la usa!
Io conosco i miei polli...sò che mi chiamano anche per un messaggio:
"stampante spenta"...cerco di fare apparire meno messaggi possibili!
Sigh! :)

.m
l'esempio l'ho trovato sulla rete.
ma è veramente così *terribile* ?????
che vuol dire dipende molto da chi gestisce lo stato di presentazione?
quello che volevo cercare di sapere ( e a questo punto forse mi sembra
di avere capito che non c'è una risposta univoca ) è cosa la classe
deve restituire / invocare nel caso di un errore.
tipicamente una classe restituisce un oggetto.
ma se occorre un errore non gli posso dire di restituire un numero che
potrei "trappare" nello strato superiore che mi si incavola....
ps
visto l'esempio terribile hai qualche sito dove posso vedere del
codice decente?
grazie

Sigh! :)
concordo!!

 non si incavola?
zac
ARRRRGGGGHHHHHHH!!!!......eh?Ma che stai dicendo????
pseudo codice scrivo a braccio
Class pippo
public property errClasse as integer
public sub New
    errClasse=0
end sub
public sub ConnessioneDB
....
try
BOOM esplode
catch BOOM esplode
    errClasse=20
end try
...
End sub
end class
...nel codice.....pseudo codice ancora....
dim Test as new Pippo
conta =0
do
test.ConnessioneDB
conta+=1
loop until test.errClasse =0 OR Conta=3
if conta =3 Then
    decidi se mostrare l'errore(strato presentazione che si attiva) o
stoppare tutto perchè sei in errore o eseguire manovre di correzione
end if

 loop until test.errClasse =0 OR Conta=3
ovvio che la aggiusti....casomai con una procedura di wait fra 2
tentativi...o con una procedura di ping per vedere se il pc risponde e
la rete funziona...insomma carpisci l'idea...poi sviluppala in base a
che ti serve!



ok
ma la classe mi deve restituire un oggetto come un dataReader che
faccio
esempio del cavolo
Public Class GenericFile
    Private mFile As String
    Public Property file() As String
        Get
            Return mFile
        End Get
        Set(ByVal value As String)
            mFile = value
        End Set
    End Property
    Public Function GetSR() As StreamReader
        Try
            Dim sr As StreamReader = New StreamReader(file)
            Return sr
        Catch ex As Exception
            'che ci srivo qui??????
        End Try
    End Function
End Class
nella form
	Dim kkk As New GenericFile
        kkk.file = "xxxxxc:\appo.txt"
        Dim localSR As System.IO.StreamReader
        localSR = kkk.GetSr
        MsgBox(localSR.ReadLine)
grazie per la pazienza

 faccio
Hai mille modi... mica che sei obbligato a far tornare i codici di errore per forza come risultato della funzione
La prima cosa, banalissima (per brevità non metto le Property get/let):
Class ErrorInfo
  Public Code As Integer
  Public Message As String
  Public Source as String
  '[...] chi più ne ha, ne metta...
 
  Public Sub Clear()
    'resetta tutto qui sopra
  End Sub
  Public Sub Fill(code, msg, source)
    'imposta tutto qui sopra
  End Sub
End Class
Class UnaClasse
   Public Error As New ErrorInfo
   '[...] n -mila property
   Public Sub DammiQualcosa() As QualcheOggetto
     Error.Clear
     '[...] bla, bla... 
     If CazzarolaErrore Then
        Error.Fill(111,"aaa","bbb")
        Return Nothing
     Else
        Return IstanzaQualcheOggetto
     End If
   End Sub
End Class
e quindi, lato presentazione
x = UnaClasse.FaiQualcosa
If x Is Nothing Then
   'mostri o non mostri UnaClasse.Error.xx, come meglio credi
End If

 
io metterei un catch piu' specifico nella classe e uno generico nella 
form.
classe
 metodo
  try
   codice
   codice
   codice
  catch ex as ioexception
   codice gestione errore
   codice gestione errore
  end try
 end metodo
end classe
form
 metodo
  try
   codice
   classe.metodo
   codice
   codice
  catch ex as exception
   codice gestione errore
   codice gestione errore
  end try
 end metodo
end form
-- 
Paolo opg
BE AWARE that this post uses a fake reply-to address
to contact me write to:
janickg ( at ) hotmail ( dot ) com
--

 che vuol dire dipende molto da chi gestisce lo stato di presentazione?
io adoro le exception che risolvono a monte tutti i problemi che ci 
sono sempre stati nel mondo COM con gli HRESULT, che tipicamente dopo 
un po' vengono ignorati...
La regola di fondo è: se ho un comportamento erroneo meglio 
un'applicazione che crasha per una eccezione non gestita piuttosto che 
uno stato inconsistente dei dati.


 End Class
zac
Ti spiego la cosa come viene "pensata"nei miei programmi
Form--->Pulsante "leggi file"->click
classe business
Contiene
Legge(nome,dispositivo)
questa funzione INVOCA
....da una lista di plugin  "fisicamente" la lettura
Questa configurazione a cui ci sono arrivato dopo tanto (purtroppo si
vede che non sono laureato in informatica!!!)...mi permette di essere
molto versatile.
Ho un plugin che mi legge il file semplicemente...ne ho un altro che
pinga un server e lo legge in remoto...ne ho un altro che fa finta di
leggere un file...ma in realtà lo recupera da un database!
Lo svantaggio a parte la complessità è che io (a differenza di quanto
sostiene Mauro) NON VOGLIO errori nel plugin!
Quindi ...male che vada il plugin NON DEVE FARE NULLA...ma io devo
saperlo!
Per farlo....mi faccio ritornare dal plugin informazioni sul suo
errore.
Nei casi semplici sono proprietà che vengono valorizzate...in altri
proprio una classe custom!
N.B.
è ovvio che la classe business Legge(nome,dispositivo) deve
impiparsene alquanto di timeout ed  errori di rete.Per quanto
possibile queste cose devono essere risolte dal plugin!
Mentre è ovvio che dovrà farsi carico degli errori da essa dipendenti:
nome file errato, path inesistente, concorrenza con altri utenti e via
andare
è altrettanto ovvio che la catena va ripercora anche a ritroso
-> Plugin tenta di risolvere l'errore
non ci riesce
--->classe business viene informata: tenta di risolvere l'errore
non ci riesce
------>classe business comunica l'errore allo strato di presentazione
che demanda alla fine all'utente la risoluzione dell'errore.
QUI io STOPPO al limite l'applicazione se è impossibile risolvere(se
il server è spento io non posso farci nulla...te lo comunico e poi ti
arrangi!)....ma crashare no! Da evitare come la peste!
Lo strato incosistente cerco per quanto umanamente possibile di non
averlo mai!
Subordino tutto ad una sorta di transaction mentale nello sviluppo di
un programma: se fallisce qualcosa...annullo tutto!
Crashare può succedere....ma cavolo con risorse managed è parecchio
difficile!
Certo se collego grid32.ocx comctl.ocx e grid varie di terzi ...va beh
me la cerco!
Ma se ho stratificato bene...crasha l'interfaccia...non i "dati"!!!
Parlo
sempre e soltanto IMHO eh !!!
Saluti!

.m
ok, ci studio sopra



grazie anche a te Paolo



leggo con calma il tuo posto e cerco di capire
hai messo in mezzo un sacco di informazioni
grazie



mica ho capito....
porta pazienza
se metto
Public Class GenericFile
    Public mError As New ErrorInfo
mi da errore
Errore	1	'mError' non può esporre il tipo 'ErrorInfo'
all'esterno del progetto mediante class 'GenericFile'.	
ho messo mError, poichè Error mi dava l'errore
Parola chiave non valida come identificatore.	
ciao


wrote:

pardon....
non avevo messo la classe pubblica
ci lavoro sopra
grazie

 On Thu, 14 Apr 2011 03:15:04 -0700 (PDT), "Wodka40[Google]"
zac
Devi capire che se usi dotNet (o Java) usi un linguaggio orientato
agli oggetti!
Il modo di pensare una applicazione viene scomposto in questi
mattoncini lego (anche con il vecchio vb6 lo potevi fare)...quindi
nulla di nuovo!
Di nuovo per uno studente che esce da una scuola superiore o per chi
come me veniva da vb6 è la COMBINAZIONE di questi mattoncini!
Siccome l'informatica è tecnica e non arte....non c'è bisogno di
reInventare la ruota tutte le volte!
Ci sono modi STANDARD di combinare questi "mattoncini" chiamati
PATTERN
Essi descrivono bene come strutturare una parte...o tutta
l'applicazione!
ad esempio
http://www.dofactory.com/Patterns/Patterns.aspx
Per me.....c'hai una confusione immane nel tuo cervello!
Quindi , sempre IMHO,
PRIMA appropriati bene delle basi del linguaggio (e qui il solito link
http://totemslair.org/guide/vb.php
 )
POI
sperimenta tecniche di scrittura utilizzando pattern e robe varie!
ad esempio
http://community.visual-basic.it/alessandro/archive/2010/08/13/31848.aspx
http://www.dotnetmarche.org/blogs/article/archive/2006/10/30/Creare-un-programma-estendibile-mediante-plugin-_2D00_-Parte-1.aspx
....e così via!
Saluti!



accidenti quanta roba!
grazie grazie grazie
mi metto subito a studiare.
compatbilmente con tutti gli altri impegni....
aspettati grosse rotture di balle :)