Toon posts:

[C#] Try Catch Finally

Pagina: 1
Acties:

Verwijderd

Topicstarter
Weet iemand of het zo is dat
als je een functie aanroept in een try block dat, dat try ook geld voor alles wat er in de functie gebeurt??

effe voorbeeldje.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
try
{
    int i = 5;
    Add(i);
}
catch ( Exception exp)
{
    MessageBox.Show(exp.Message,
        "Error",
        MessageBoxButtons.OK,
        MessageBoxIcon.Error);
}

protected void Add(int Integer)
{
Integer += 5;
}


mijn vraag is dus als er een exception word gemaakt in Add word die dan opgevangen door de try catch block??


Thanks,

Johnny

[ Voor 5% gewijzigd door Verwijderd op 04-06-2003 11:59 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Erhm.. Probeer het uit? Zet een ongeldig statement in de Add method?
Visual Basic .NET:
1
2
3
4
5
6
7
Protected Sub Add(dValue as Decimal)

    Dim dTempValue as Decimal
    Dim dDivideValue as Decimal= 0
    dTempValue = dValue / dDivideValue 

end sub

[ Voor 64% gewijzigd door gorgi_19 op 04-06-2003 11:56 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Alle statements die in dat try block staan worden idd beschermt door het try-statement.

Verwijderd

Topicstarter
Bedankt Alarmnummer :)

Was C# vraag Gorgi ;)

maar hoe krijg je je code in zo'n box
ik was al faq aan het kijken maar kon het niet vinden


Was gorgie hieronder zegt = logisch
maarja soms geeft het wel problemen maartoch

[ Voor 113% gewijzigd door Verwijderd op 04-06-2003 11:58 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Verwijderd schreef op 04 juni 2003 @ 11:54:
Bedankt Alarmnummer :)

Was C# vraag Gorgi ;)
Imho is C# voor VB.Net'ers te lezen en omgekeerd. :)

Over je 2e vraagje..
[code=c#][/code]
Zie ook: Hoe post je code? / Hoe gebruik je de code tag?

[ Voor 27% gewijzigd door gorgi_19 op 04-06-2003 11:58 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
Door het gewoon uit te proberen, kon je het ook ff testen hoor. ;)

Dat is idd een voordeel van exception-handling, dat excepties die op een lager niveau (ergens binnen een functie gethrowed worden), opgevangen worden door het catch() blok in de hogerliggende functie. (Zoals jouw voorbeeld).
Echter, als er ook een try/catch blok binnen die Add method staat, dan zal de exceptie daar opgevangen worden. (Als je een catch-blok hebt die die exceptie opvangt natuurlijk).

https://fgheysels.github.io/


Verwijderd

Topicstarter
Bedankt iedereen voor jullie reacties
had het zelf kunnen testen maar had daar nog niet aan gedacht

  • Remco
  • Registratie: Januari 2001
  • Laatst online: 21-08 16:11
Ik weet niet of het ook zo met C++ is, maar met vb .net werkt de try catch finally niet.
Het finally gedeelte word niet goed afgevangen.
Hij loopt hier altijd door heen, ongeacht of er wel of geen catch is geweest.
Oplossing is natuurlijk simpel door een harde verwijzing naar een label, maar erg netjes is het niet.

The best thing about UDP jokes is that I don't care if you get them or not.


  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
Dus, die finally werkt dan wel goed. :)

De code in een finally statement wordt altijd uitgevoerd. Ongeacht of er een exceptie opgetreden is of niet. Dat is juist de bedoeling van de finally, check de manuals er maar op na.

Je kan trouwens ook perfect een catch/finally blok hebben zonder catch-blok dus.

[ Voor 16% gewijzigd door whoami op 04-06-2003 12:06 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
In C# is het zo
dat hij eerst de try block uitvoerd mocht hier een exception optreden dan gaat tie naar de catch block om dat uit te voeren en daarna word de finally block uitegevoerd. en ook als er geen exception optreed word de finally block uitegevoerd dus finally is een beetje onafhankelijk van wat er gebeurt of je moet de application quiten ofcourse

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Je kan trouwens ook perfect een catch/finally blok hebben zonder catch-blok dus.
Waarbij hij ook op z'n nuttigst is, om lokale acties ongedaan te kunnen maken als er nested een exception naar buiten komt, zonder dat je die exception expliciet hoeft te vangen en door te gooien. Bijv.:
C++:
1
2
3
4
5
6
7
8
9
10
char* Memory;
try
  {
  Memory = new char[684];
  CallExceptionThrowingFunction();
  }
__finally
  {
  delete [] Memory;
  }

Professionele website nodig?


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
curry684 schreef op 04 June 2003 @ 12:39:
[...]
Waarbij hij ook op z'n nuttigst is, om lokale acties ongedaan te kunnen maken als er nested een exception naar buiten komt, zonder dat je die exception expliciet hoeft te vangen en door te gooien. Bijv.:
C++:
1
2
3
4
5
6
7
8
9
10
char* Memory;
try
  {
  Memory = new char[684];
  CallExceptionThrowingFunction();
  }
__finally
  {
  delete [] Memory;
  }
C++ heeft geen __finally. Dat is ook niet nodig; C++ heeft destructors:

C++:
1
2
std::vector< char> Memory (684);
CallExceptionThrowingFunction( &Memory[0] ); // je hebt't niet voor niets


MSVC++ heeft wel __try/__finally, maar de __ zijn al een hint dat het geen C++ is.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Remc0 schreef op 04 juni 2003 @ 12:02:
Ik weet niet of het ook zo met C++ is, maar met vb .net werkt de try catch finally niet.
Het finally gedeelte word niet goed afgevangen.
Hij loopt hier altijd door heen, ongeacht of er wel of geen catch is geweest.
Oplossing is natuurlijk simpel door een harde verwijzing naar een label, maar erg netjes is het niet.
Ja duh, dat is wat finally doet. Dit block wordt _ALTIJD_ uitgevoerd, ongeacht of de try slaagt of dat je een exception krijgt ;) Ideaal bv wanneer je een connection moet closen of een object moet disposen, ongeacht de exception ben je altijd in staat dit te doen.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Verwijderd

Topicstarter
MSalters schreef op 04 June 2003 @ 21:52:
[...]

C++ heeft geen __finally. Dat is ook niet nodig; C++ heeft destructors:
C# heeft toch ook gewoon destructors of ben ik nou gek??

offtopic: ik vind het toch mooi wat sommige topics te weeg brengt ( daar leer je tenminste ook wat van :)

[ Voor 49% gewijzigd door Verwijderd op 05-06-2003 09:11 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
C# heeft idd destructors, maar je weet in C# nooit wanneer die destructor echt uitgevoerd wordt. Het is pas als de GC in actie schiet dat die destructors uitgevoerd worden. In C# en andere talen die onder een VM draaien (zoals Java) worden objecten pas 'vernietigd' als de Garbage collector runt en die de objecten opkuist waarnaar nergens meer verwezen wordt.
In C++ (en andere niet - managed talen) worden die destructors echt uitgevoerd vanzodra het object vernietigd wordt.

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Voor zover ik had begrepen uit dit artikel, is het wel mogelijk om C# objecten te laten vernietigen op het moment dat jij het wil. De gebruikte codevoorbeelden zijn zowel in C++ als C#, om de verschillen aan te geven.

Ik heb het nog niet goed doorgelezen; staat iig op m'n to-do lijstje.. :P

[ Voor 15% gewijzigd door gorgi_19 op 05-06-2003 09:34 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
Dat kan je doen door Finalize() expliciet op te roepen, maar dat kan je enkel doen vanuit de class zelf of vanuit een inherited class. (Desctructor is protected).

Je kan natuurlijk ook altijd de GC.Collect() method aanroepen om de garbage collector in actie te laten schieten. :P

[ Voor 10% gewijzigd door whoami op 05-06-2003 09:33 ]

https://fgheysels.github.io/


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Een destructor in C# IS de finalize. Finalizers zijn geimplementeerd in C# door destructors.
ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.1033/cpgenref/html/cpconfinalizedispose.htm

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

MSalters:
C++ heeft geen __finally. Dat is ook niet nodig; C++ heeft destructors:
Nogal overbodige opmerking daar ik direct antwoord geef op hoe finally werkt, en dat ik daaroor toevallig een compiler-specific keyword in C++ gebruik boeit niets, ik had het ook in Java, C# of VB.net kunnen schrijven ware het niet dat ik in C++ dubbel zo snel klaar ben en ik overdag op m'n werk wel betere dingen te doen heb.

Professionele website nodig?

Pagina: 1