Avatar billede dj_uncas Nybegynder
08. marts 2006 - 11:59 Der er 10 kommentarer og
1 løsning

Properties og exceptions

Hejsa

Jeg har en klasse med en metode hvori der kastes en exception hvis to parametre ikke passer, men det er ikke det vigtige.

Det vigtige er at jeg lige før den if-sætning, der evt. resulterer i en exceptions, sætter en integer propery. I min GUI vil jeg gerne udskrive den integer, men den er altid 0 hvis der kastes en exception.

Jeg har prøvet at debugge mig igennem det, og kan se at min property faktisk bliver sat, men åbenbart bliver sat til 0 igen når der kastes en exception..

Er der nogen der ved hvad der sker med en klasses property når der kastes en exception? Bliver de nulstillet eller hvad?
Avatar billede soreno Praktikant
08. marts 2006 - 12:40 #1
Følgende test:

  class Program {
    public void doStuff(PropertyClass p) {
      Console.WriteLine(p.FooProperty + " initial value of property");
      p.FooProperty = 1111;
      Console.WriteLine(p.FooProperty + " before exception");
      throw new Exception("Test Exception");
    }

    static void Main(string[] args) {
      PropertyClass p = new PropertyClass(8888);
      Program pgr = new Program();
      try {
        pgr.doStuff(p);
      } catch {
        Console.WriteLine("Exception caught");
      }
      Console.WriteLine(p.FooProperty + " after exception");
      Console.ReadKey();
    }
  }

  class PropertyClass {
    private int foo;

    public PropertyClass(int foo) {
      this.foo = foo;
    }

    public int FooProperty {
      get { return foo; }
      set { foo = value; }
    }
  }

Giver dette output:
8888 initial value of property
1111 before exception
Exception caught
1111 after exception

Så værdien af en property bevarer sin værdi efter en exception.
Avatar billede dj_uncas Nybegynder
08. marts 2006 - 14:18 #2
Ja, jeg har lavet lignende tests selv, men det jeg er ude efter er en mere teknisk forklaring af hvad der rent effektivt sker når der kastes en exception..
Avatar billede soreno Praktikant
08. marts 2006 - 15:21 #3
Så tror jeg du skal kigge lidt nærmere på:
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-335.pdf

Afsnit "12.4.2.8 Control flow restrictions on protected blocks".


Når der kastes en exception sker der en ændring af control-flow i den tråd hvor exception kastes.

Sidste del af IL koden for doStuff metoden:
  IL_003d:  call      void [mscorlib]System.Console::WriteLine(string)
  IL_0042:  nop
  IL_0043:  ldstr      "Test Exception"
  IL_0048:  newobj    instance void [mscorlib]System.Exception::.ctor(string)
  IL_004d:  throw
// end of method Program::doStuff

Hvad der så sker der efter har jeg ikke læst, men jeg har en forventning om at det står i ovenstående nævnte afsnit. Det er bare ikke så let læseligt.
Avatar billede soreno Praktikant
08. marts 2006 - 15:22 #4
Kaldet til doStuff (med tilhørende try/catch) ser sådan ud:

  .try
  {
    IL_0012:  nop
    IL_0013:  ldloc.1
    IL_0014:  ldloc.0
    IL_0015:  callvirt  instance void TestExceptionVsProperty.Program::doStuff(class TestExceptionVsProperty.PropertyClass)
    IL_001a:  nop
    IL_001b:  nop
    IL_001c:  leave.s    IL_002e
  }  // end .try
  catch [mscorlib]System.Object
  {
    IL_001e:  pop
    IL_001f:  nop
    IL_0020:  ldstr      "Exception caught"
    IL_0025:  call      void [mscorlib]System.Console::WriteLine(string)
    IL_002a:  nop
    IL_002b:  nop
    IL_002c:  leave.s    IL_002e
  }  // end handler
Avatar billede soreno Praktikant
08. marts 2006 - 15:26 #5
Uden at være helt sikker så tror jeg det der sker er:

  1 newobj (som er af typen Exception) smides på stakken
  2 throw sørger for at control flow ændres
  3 catch blokken aktiveres (fordi det var en throw instruktion)
  4 pop henter Exception objektet, som så kan bruges hvis det deklareres i koden (har jeg ikke gjort).

F.eks noget ala:
try {
  pgr.doStuff(p);
} catch (Exception e) {
  Console.WriteLine(e.StackTrace());
}
Avatar billede dj_uncas Nybegynder
08. marts 2006 - 15:45 #6
Ok ja, det er jo straks mere teknisk ;-)

Jeg synes dog ikke det fremgår af ovenstående hvad der fysisk sker med det objekt der fremprovokerede en exception. Eller er det mig der ikke kan læse?
Avatar billede soreno Praktikant
08. marts 2006 - 15:48 #7
Altså hvad der, i eksemplet, sker med Program objektet (som doStuff er indeholdt i) ?

Der er i IL koden intet der antyder at der skulle ske noget, ud over de instruktioner som er udført.
Avatar billede dj_uncas Nybegynder
08. marts 2006 - 15:59 #8
Jeg tænker på hvad der sker med det objekt som i dit eksempel hedder PropertyClass, hvornår det bliver disposet, og hvorvidt properties og fields bliver disposet eller nulstillet eller hvad der sker..
Avatar billede soreno Praktikant
08. marts 2006 - 16:44 #9
Jeg kan ikke forestille mig at objektet bliver disposed på grund af exception.
Jeg referere jo til PropertyClass objektet efter at Exception er håndteret:
  Console.WriteLine(p.FooProperty + " after exception");
Avatar billede dj_uncas Nybegynder
08. marts 2006 - 23:16 #10
Tja, og jeg gør det både i min catch, og efter.. Nå, jeg kommer nok ikke nærmere lige nu. Smid et svar.
Avatar billede soreno Praktikant
09. marts 2006 - 08:12 #11
Ok.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester