11
C11 Tratarea erorilor in VB NET 1) Ce tipuri de erori există? Există mai multe tipuri de erori: - erori în faza de proiectare (erori de sintaxă) care survin când o comandă este scrisă greşit (cuvinte cheie incorecte, parametrii lipsă, expresii incorecte, etc. ) -erori de execuţie (detectabile) care sunt cauzate de situaţii necontrolabile de program (împărţirea la zero, un fişier lipsă, un fişier deja activ, depăşirea sau violarea memoriei, etc. ) - erori de logică care duc la obţinerea de rezultate incorecte sau imprevizibile 2) Care este asemănarea şi deosebirea dintre o eroare şi o excepţie? Limbajele de programare tradiţionale aveau un foarte bine dezvoltat concept care cuprindea noţiunea de eroare (error). Se considera ca fiind eroare orice situaţie în care programul nu evolua corect. Ulterior, platformele moderne (C++, Java) au introdus un nou concept excepţia (exception) În aceste noi condiţii (din punctul strict de vedere al programării): -eroarea ţine strict de programator, atunci când nu gestionează în mod corect structurile aplicaţiei (exemplu: a nu prevedea faptul că numărul la care se

C11 Tratarea Erorilor in VB NET

Embed Size (px)

DESCRIPTION

1) Ce tipuri de erori există?Există mai multe tipuri de erori: - erori în faza de proiectare (erori de sintaxă) care survin când o comandă este scrisă greşit (cuvinte cheie incorecte, parametrii lipsă, expresii incorecte, etc.)-erori de execuţie (detectabile) care sunt cauzate de situaţii necontrolabile de program (împărţirea la zero, un fişier lipsă, un fişier deja activ, depăşirea sau violarea memoriei, etc.)- erori de logică care duc la obţinerea de rezultate incorecte sau imprevizibile

Citation preview

Page 1: C11 Tratarea Erorilor in VB NET

C11 Tratarea erorilor in VB NET

1) Ce tipuri de erori există?

Există mai multe tipuri de erori:

- erori în faza de proiectare (erori de sintaxă) care survin când o comandă este scrisă greşit (cuvinte cheie incorecte, parametrii lipsă, expresii incorecte, etc.)

-erori de execuţie (detectabile) care sunt cauzate de situaţii necontrolabile de program (împărţirea la zero, un fişier lipsă, un fişier deja activ, depăşirea sau violarea memoriei, etc.)

- erori de logică care duc la obţinerea de rezultate incorecte sau imprevizibile

2) Care este asemănarea şi deosebirea dintre o eroare şi o excepţie?

Limbajele de programare tradiţionale aveau un foarte bine dezvoltat concept care cuprindea noţiunea de eroare (error). Se considera ca fiind eroare orice situaţie în care programul nu evolua corect.

Ulterior, platformele moderne (C++, Java) au introdus un nou concept excepţia (exception)

În aceste noi condiţii (din punctul strict de vedere al programării):

-eroarea ţine strict de programator, atunci când nu gestionează în mod corect structurile aplicaţiei (exemplu: a nu prevedea faptul că numărul la care se realizează împărţirea poate fi zero poate fi considerată o eroare)

-excepţia este o situaţie care nu se încadrează în modul de execuţie uzual sau dorit al aplicaţiei, însă nu înseamnă că apare mai rar sau mai des decât situaţia dorită de programator sau utilizator (exemplu: dacă stabilim că numărul la care se realizează împărţirea nu poate fi zero, atunci cazul în care utilizatorul introduce valoarea zero este o excepţie)

Page 2: C11 Tratarea Erorilor in VB NET

2) Cum sunt tratate AUTOMAT excepţiile în VB.NET?

-atunci când apare o excepţie programul se întrerupe şi sistemul afişează o casetă ajutătoare pentru a depista cauza anomaliei

Exemplu:

Fie funcţia Impart definită astfel

Private Function Impart(ByVal a As Integer, ByVal b As Integer) As Decimal Dim Rezultat As Decimal Rezultat = a / b Return Rezultat End Function

şi apelul acesteia

Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click Dim X As Integer Dim Y As Integer X = InputBox("Tastati deimpartitul:") Y = InputBox("Tastati impartitorul:") 'Apel functie MsgBox("X/Y= " & Impart(X, Y))

End Sub

Evident că dacă vom introduce x=10 şi y=2 vom obţine rezultatul

Dar dacă vom introduce x=10 şi y=0 vom obţine rezultatul

Page 3: C11 Tratarea Erorilor in VB NET

De asemenea dacă vom introduce x=10a şi y=… vom obţine rezultatul

3) Cum ar trebui tratate excepţiile de programator în VB.NET?

Programatorul ar trebui să prevadă posibilitatea apariţiei unor asemenea anomalii şi să le trateze prin program prin mecanisme specifice

Excepţiile sunt obiecte derivate din clasa System.Exception, care oferă două proprietăţi mai importante:

Page 4: C11 Tratarea Erorilor in VB NET

- Message – conţine o descriere textuală a erorii;

-Source – redă numele aplicaţiei sau al obiectului care a generat eroarea

4) Ce oferă VB.NET pentru tratarea excepţiilor?

VB.NET oferă o modalitate structurată de interceptare şi tratare a excepţiilor, bazată pe structura Try … Catch … Finally cu sintaxa

Try

[instructiuni monitorizate][Exit Try]

[Catch NumeExceptie [As TipExcepte]

[instructiuni de tratare a tipului de exceptie][Exit Try]

Finally

[instructiuni care se executa la sfarsit]

End Try

5) Cum poate fi perfecţionat programul anterior?

Vom monitoriza zona generatoare de erori şi vom trata excepţiile previzibile şi restul excepţiilor astfel:

Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click Dim X As Integer Dim Y As Integer 'Inceputul monitorizarii Try X = InputBox("Tastati deimpartitul:") Y = InputBox("Tastati impartitorul:") 'Apel functie MsgBox("X/Y= " & Impart(X, Y)) 'Tratarea exceptiilor specifice previzibile Catch DateNenumerice As InvalidCastException MsgBox("Date nenumerice")

Catch ImpartireLaZero As OverflowException

MsgBox("Impatire la zero")

'Tratarea exceptiilor neprevizibile Catch ExceptiiGenerice As Exception MsgBox("Alte erori")

Page 5: C11 Tratarea Erorilor in VB NET

End Try

End Sub

Acum totul este controlat de program. Astfel:

- dacă vom introduce x=10a şi y=… vom obţine rezultatul

-iar dacă vom introduce x=10 şi y=0 vom obţine rezultatul

Atunci când vor apare alte situaţii anormale generate de sistem sau de mediul de operare vom obţine şi mesajul – Alte erori

6) Ce alte posibilităţi de tratare a erorilor mai există în VB.NET?

A) Exită posibilitatea de a ne crea propria clasă pentru tratarea erorilor, evident o clasă derivată dintr-o clasă a sistemului, de regulă derivată din clasa System.Exception.

B) Vom avea posibilitatea să generăm propriile excepţii atunci când sunt îndeplinite anumite condiţii. Generarea ”aruncarea” unei excepţii se poate face prin instrucţiunea:

Throw exceptie

unde excepţie reprezintă o instanţă a unei clase de excepţie.

Page 6: C11 Tratarea Erorilor in VB NET

În momentul apariţiei sau generării unei excepţii, execuţia programului se opreşte în punctul respectiv şi se transferă blocului Catch (dacă este definit, dacă nu, aşa cum am arătat mai sus apare o casetă de excepţie şi progranul se încheie).

Generarea excepţiilor se poate folosi la implementarea mai riguroasă a validărilor de integritate a proprietăţilor, când în loc să afişăm un mesasj de eroare vom întrerupe controlat execuţia programului la introducerea unor date incorecte şi nu vom permite continuarea programului decât după introducerea corectă a datelor. Ca să înţelegem acest mecanism vom relua exemplul de validare a datelor de la cursul 8 (punctul 2) unde am marcat cu galbel zonele care vor fi afectate:

a) Programul iniţial de la Cursul 8

-definirea clasei Cec

Public Class Cec 'definirea clasei parinte Inherits Document 'definirea atributelor Private m_TipOperatie As String Private m_SumaCec As Integer 'definirea proprietatilor Public Property tipOperatie() As String Get Return m_TipOperatie End Get Set(ByVal value As String) 'validarea datelor introduse If value = "I" Or value = "P" Or value = "S" Then m_TipOperatie = value Else m_TipOperatie = "" MsgBox("Tip operatie diferit de I,P sau S") End If

End Set End Property Public Property sumaCec() As Integer Get Return m_SumaCec End Get Set(ByVal value As Integer) m_SumaCec = value End Set End Property 'definirea metodelor

Page 7: C11 Tratarea Erorilor in VB NET

End Class

ii) definirea colecţiei

Public Class Form1 'definirea colectiei Dim cecuri As New ArrayListEnd Class

iii) instanţierea unui obiect şi adaugarea în colecţie

Public Class Form1 'definirea colectiei Dim cecuri As New ArrayList

Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click 'Definesc un cec o instanta a clasei Cec Dim unCec As New Cec 'Incarc proprietatile unCec.felDoc = InputBox("Tastati fel document") unCec.tipOperatie = InputBox("Tastati tip operatie") unCec.sumaCec = InputBox("Tastati suma") 'Verific daca cecul este corect If unCec.tipOperatie = "" Then 'Distrug cecul - nu este corect MsgBox("Cec gresit") unCec = Nothing Else 'Incarc un cec in colectie - este corect cecuri.Add(unCec) MsgBox("Cec Ok") End If End Sub

End Class

b) Programul modificat am marcat cu verde locul modificărilor

-definirea clasei Cec

Public Class Cec 'definirea clasei parinte Inherits Document 'definirea atributelor Private m_TipOperatie As String Private m_SumaCec As Integer 'definirea proprietatilor Public Property tipOperatie() As String Get

Page 8: C11 Tratarea Erorilor in VB NET

Return m_TipOperatie End Get Set(ByVal value As String) 'validarea datelor introduse If value = "I" Or value = "P" Or value = "S" Then m_TipOperatie = value Else Throw New Exception("Tip operatie diferit de I,P sau S")'Generare exceptie End If

End Set End Property Public Property sumaCec() As Integer Get Return m_SumaCec End Get Set(ByVal value As Integer) m_SumaCec = value End Set End Property 'definirea metodelorEnd Class

ii) definirea colecţiei

Public Class Form1 'definirea colectiei Dim cecuri As New ArrayListEnd Class

iii) instanţierea unui obiect şi adaugarea în colecţie

Public Class Form1 'definirea colectiei Dim cecuri As New ArrayList

Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click 'Definesc un cec o instanta a clasei Cec Dim unCec As New Cec Try'Incepem monitorizarea 'Incarc proprietatile unCec.felDoc = InputBox("Tastati fel document") unCec.tipOperatie = InputBox("Tastati tip operatie") unCec.sumaCec = InputBox("Tastati suma") cecuri.Add(unCec)

Catch TipOperatieEronat As Exception MsgBox(”A aparut eroarea:” & TipOperatieEronat.Message ) End Try'Sfarsit monitorizare

End Sub

Page 9: C11 Tratarea Erorilor in VB NET

End Class

Practic atunci când tipul operaţiei va fi eronat (diferit de I, P sau S) programul va fi întrerupt şi în loc să se execute operaţia cecuri.Add(unCec) adică adugarea unui nou cec în colecţie, se va executa blocul Catch adică afişarea unui mesaj de eroare MsgBox(”A aparut eroarea:” & TipOperatieEronat.Message ) şi programul ne obligă să introducem un tip de operaţie corect pentru a putea continua sau să abandonăm programul. Oricum ceea ce este important că în colecţie nu vor fi introduse cecuri cu tip operaţie eronat.

vom monitoriza zona generatoare de erori şi vom trata excepţiile previzibile şi restul excepţiilor astfel: