Søger du en specifik kategori?

 



Oprettet tir. d. 03. februar 2009 kl. 06:44

visualdeveloper
visualdeveloper (20.879 point)
Guidens karaktér
1
2
3
4
5

Undtagelseshåndtering i C#

I modsætning til C++ kan man i C# ikke skrive et program uden undtagelseshåndtering, så derfor har jeg skrevet denne guide til hvordan men bruger det. Egne undtagelser er også med.
Undtagelseshåndtering i C#

Grunden til at jeg har valgt at skrive en artikel om undtagelseshåndtering i C# er, at det er en meget vigtig ting. En undtagelse er når Windows genererer en fejl - når dit program udfører en "ulovlig" handling.
Fejlene kan opstå på mange forskellige måder, men man kan dele dem op i to grupper - dem men selv er skyld i som fx almindelige programmeringsfejl, og dem man ikke selv kan kontrollere som fx hvis der ikke er nok hukommelse til at programmet kan køre videre.

try...catch...finally
Når man skal lave en undtagelseshåndtering i C# skal man bruge de tre nøgle ord try, catch og finally. Det stykke kode som skal kunne kaste en undtagelse, sætter man i en try-blok og koden der skal håndtere undtagelser fra try-blokken, anbringer man i en catch-blok, og til sidst finally som bruges til oprydning som SKAL klares inden programmet afsluttes.

Her er syntaksen for en undtagelseshåndtering i C#:

try
{
...kode der kan generere fejl
}
catch
{
...fejlhåndtering
}
finally
{
...oprydning
}


...dvs. at den kode der kan indeholde fejl, skrives i try-blokken, den kode der skal håndtere fejlene, skrives i catch-blokken og den kode der skal ryde op sættes i finally-blokken.

Her er et godt lille eksempel på brug af try...catch:

using System;
class Eksperten
{
  public static void Main()
  {
  int i;

  try
  {
    i++;
  }
  catch
  {
    Console.WriteLine("Fejl fundet !");
  }
  }
}


...da det i C# er forbudt at bruge ikke-initialiserede variabler. (dvs at i ikke indeholder nogen værdi) kan man ikke lægge 1 til i og der genereres en fejl. Men da vi har lavet en undtagelseshåndtering, kommer Windows ikke med nogen pop-up men den går til catch-blokken som udskriver "Fejl fundet !".

Mere specifikke fejl ?
Denne form for catch vi har brugt her er bare den simple...som fanger alle fejl.
Hvis vi ønsker at fange mere specifikke fejl som fx. en division med 0. Her er et eksempel:

using System;
class Eksperten
{
            public static void Main()
            {
                        int x = 0;
                        int div = 0;
                        try
                        {
                                    div = 100/x;
                                    Console.WriteLine("Den linje bliver kompileret, men ikke udført !");
                        }
                        catch(DivideByZeroException de)
                        {
                                    Console.WriteLine("DivideByZeroException" );
                        }
                        catch
                        {
                                    Console.WriteLine("Alle andre Exceptions" );
                        }
                        finally
                        {
                                    Console.WriteLine("Finally-Blok");
                        }
                        Console.WriteLine("Resultatet er {0}",div);
            }
}


Her bruger vi DivideByZeroException som fanger alle fejl der opstår når der bliver divideret med 0. Alle andre fejl bliver håndteret i den anden catch-blok. Alle undtagelser arver fra System.Exception.


Brug af finally
Efter en try- og en catch-blok kommer finally blokken som bruges til oprydning. Et godt eksempel på det er når vi åbner en fil og læser fra den, så skal vi sikre os at filen bliver lukket igen. Her er et eksempel på det:

using System;
using System.IO;

public class Eksperten
{
  public static void Main()
  {
      StreamReader s = null;

      try
      {
      s = File.OpenText("c:\\fil.txt");
      while (s.Peek() > -1)
        Console.WriteLine(s.ReadLine());  //her læses der fra filen
      }
      catch
      {
        Console.WriteLine("Der opstod en fejl !");  //en fejlhåndtering
      }
      finally
      {
        if (s != null)
            s.Close();  //her lukkes filen hvis den stadig er åben
      }
  }
}


Objektorinterede undtagelser
Alt I C# er objektorinteret, og derfor er undtagelser også objekter med egenskaber. Nogle af disse egenskaber kan være godt at kende. Her er et eksempel på brug af dem:

using System;

public class Eksperten
{
  public static void Main()
  {
      string s = "Eksperten";
     
      try
      {
        int i = Int32.Parse(s);
      }

      catch (Exception e)
      {
        Console.WriteLine("Der er opstået en fejl");

        Console.WriteLine("Meddelelse: {0}", e.Message);
        Console.WriteLine("TargetSite: {0}", e.TargetSite);
        Console.WriteLine("Kilde: {0}", e.Source);
      }
  }
}


Her finder vi de tre egenskaber af objektet e (Exception). Message som viser fejlmeddelelsen, TargetSite som viser den metode hvor undtagelsen opstod og Source som viser applikationsnavnet.

I mit eksempel prøver vi at konvertere en String til en Integer men det kan vi ikke da en Integer kun kan indeholde heltal og derfor opstår der en fejl, som så bliver håndteret i catch-blokken.

Egne undtagelser - NYT
Ud over .NET-kernens undtagelser, kan du også lave eller kaste dine egne undtagelser som det jo hedder. Det gøres ved at bruge nøgleordet throw og nøgleordet new. Denne mulighed kan være praktisk hvis du ikke lige kan finde en exception-klasser der passer til dit program. Her er et eksempel på hvordan man kaster sine egne undtagelser:

using System;

public class Eksperten
{
  public static void Main()
  {
      try
      {
        string Tmp;
        DateTime Dato;
       
        Console.WriteLine("Indtast en dato, der ligger før dags dato");
        Tmp = Console.ReadLine();

        try
        {
            Dato = DateTime.Parse(Tmp);
        }
        catch
        {
            throw new Exception("Ikke en gyldig dato");
        }

        if (Dato >= DateTime.Now)
            throw new Exception("Dato skal ligge før dags dato");
            Console.WriteLine("Du har indtastet {0:d}", Dato);
        }
        catch (Exception e)
        {
          Console.WriteLine(e.Message);
        }
      }
}


Først kontrolleres om den indtastede dato kan konverteres til en gyldig dato. Hvis ikke det kan lade sig gøre, genereres en undtagelse med throw-nøgleordet, som her:

Indtast en dato, der ligger før dags dato
01-099-2006
Ikke en dato


Eller hvis datoen ligger før dags dato:

Indtast en dato, der ligger før dags dato
01-06-1999
Dato skal ligge før dags dato
Du har indtastet 01-06-1999


Det var så det...nu skulle du gerne kunne lidt mere...bare LIDT mere om exceptions i C#. Har du kritik, spørgsmål eller idéer til artiklen så skriv det i din anmeldelse eller i dette spørgsmål: http://www.exp.dk/ (...)
Skriver du en anmeldelse, herunder, så skriv lige en begrundelse !

Skrevet man. d. 17. oktober 2005 kl. 20:17| #1

yezbarh (13.270 point)
Kort, men ellers fin

Skrevet tir. d. 18. oktober 2005 kl. 09:44| #2

brilleaben (23.009 point)
For kort - hvad med at beskrive hvordan egen exceptions kreeres og håndteres?

Skrevet tir. d. 18. oktober 2005 kl. 10:37| #3

skwat (25.826 point)
class hat{public static void Main(){Console.WriteLine("hat");}} er som jeg kan se et eksempel på et program uden error handling

Skrevet ons. d. 19. oktober 2005 kl. 00:54| #4

mysitesolution (14.434 point)
okay artikel... men hhm... har du ikke lært at fx i = i + 1; er langsommere end i++; og tilmed fylder det mere...

Skrevet tor. d. 20. oktober 2005 kl. 23:14| #5

iostream (9.715 point)
God artikel..jeg kan se at egne undtagelser kommer snart :-)
forresten er i = i + 1; rettet til i++; så nu er den god !

Skrevet fre. d. 21. oktober 2005 kl. 19:11| #6

peter_bf (12.050 point)
Han har altså rettet det hele, og egne exceptions er også tilføjet så jeg kan ikke sige andet end top :D

Skrevet lør. d. 05. november 2005 kl. 14:27| #7


Skrevet tir. d. 28. marts 2006 kl. 10:25| #8

ino (14.450 point)
God... Men kunne du ikke lave indryk i den kode du skriver for der er ret svært at læse...

Skrevet man. d. 01. maj 2006 kl. 09:16| #9

imago-dei (17.178 point)
God artikel. Jeg vil dog påpege at der er uenighed om hvordan exceptions skal behandles. Se. feks. denne artikel: http://codebetter.com/ (...) Til kommentarerne nedenunder: jeg har lidt svært ved at tro at i = i +1 skal være langsommere runtime end i++. Begge dele bliver vel oversat til præcis det samme i compileren.

Skriv en kommentar



Mest populære guides

Guidens karakter
!!!Karaktér: 3
14 stemmer
31/01 - 2011
Af: heinzdmx

Dropbox - gratis online lagerplads

Jeg vil i denne guide forklare lidt om hvad Dropbox er og også hvordan du får mest mulig plads på Dropbox. Dropbox er kort sagt en service hvor du har dine data lagt til backup på både nettet og din egen computer.
Guidens karakter
!!!Karaktér: 4
33 stemmer
02/02 - 2009
Af: jkrons

Dato- og tidsberegninger i Excel

En introduktion til simple beregninger med dato og tid i Excel. Opdateret med afsnit om beregning af tillæg.
Excel  |  Læs »
Guidens karakter
!!!Karaktér: 4
21 stemmer
06/11 - 2011
Af: fromsej

Sådan fjerner du virus og malware

Udviklingen går stærkt på "skidt"fronten, så vi har sammensat en ny og effektiv programpakke til fjernelse af det.
Virus  |  Læs »

Log ind

   

   



   




Tips & Tricks fra PC World

Teaser billede

Top 5: Virale YouTube-videoer fra Danmark

Lægger du mærke til de mere eller mindre skjulte reklamebudskaber, når du ser videoer på nettet? Vi har taget et kig på fem utrolige danske videoer, som er blevet virale hit.


Anmeldelser fra PC World

Teaser billede

Test: Mobil med Ferrari-design - og en Trabant-motor

Motorola har begået endnu en smartphone med lækkert design og potentiale til at være blandt de bedste. Men den når ikke i mål. Se her hvorfor.


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Sådan fupper smarte svindlere dig på Facebook

Se hvordan du undgår Facebook-fup i fremtiden.


Nyheder fra Computerworld

Teaser billede

App-udvikling 2.0: Sådan er den perfekte app

ComputerViews: Den værste app-hype er ved at have lagt sig, og nu ser vi konturerne af fremtidens app-design. Men hvordan udnytter man de mobile muligheder optimalt?


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger