Avatar billede koppelgaard Praktikant
15. maj 2007 - 20:19 Der er 9 kommentarer og
1 løsning

Kaste en exception

Jeg har en container som (hashtable) af en række personer
Ved tilføjelse af personer til containeren giver brug af samme nøgle 2 gange giver en fejl.
Hvordan kaster jeg en exception, som forplanter sig hele vejen op til gui-laget gennem controlleren?

Jeg vil gerne have Gui-laget til at vise en messagebox hvis der er en exception i containerlaget.

Michael
Avatar billede tomledk Nybegynder
15. maj 2007 - 20:32 #1
Du kan kaste en almindelig exception sådan her:
throw new System.Exception("Two identical keys");

og fange den i din GUI ved at lave en try-catch:
try
{
    // your business that maybe will throw an exception
}
catch(Exception exp)
{
    MessageBox.Show(exp.Message);
}
Avatar billede koppelgaard Praktikant
16. maj 2007 - 14:11 #2
Tak for svar. Jeg prøver det i aften
Avatar billede koppelgaard Praktikant
16. maj 2007 - 19:01 #3
Hej igen.
Det virker tilsyneladende, men er det en korrekt måde, jeg har gjort det på ?

Den kode hvor fejlen opstår ses lige nedfor.
Fejlen køre gennem controlleren og jeg fange den i den kode der står under den stiplede linie.

Er det korrekt fremgangsmåde ??

    public void Add(Kontakt k)
        {
           
            try
            {
                kontaktListe.Add(k.CprNr, k);
            }
            catch
            {
                throw new System.Exception("Two identical keys");
            }
        }
-------------------------------------------------------------------------

private void Btm_tilføjKontakt_Click(object sender, EventArgs e)
        {
           
            string cpr = this.textCpr.Text;
            string navn = this.textNavn.Text;
            string adr = this.textAdresse.Text;
            string tlf = this.textTelefon.Text;
            string email = this.textEmail.Text;
            try
            {
                con.KControl.OpretKontakt(cpr, navn, adr, tlf, email);
                MessageBox.Show("Kontakt kunne ikke oprettes", "Fejl", MessageBoxButtons.OK,
                    MessageBoxIcon.Asterisk);
            }
            catch{           
                MessageBox.Show("Kontakt kunne ikke oprettes","Fejl",MessageBoxButtons.OK,
                    MessageBoxIcon.Error);

            }
Avatar billede koppelgaard Praktikant
16. maj 2007 - 19:10 #4
Og hvordan ved jeg, hvor fejlen stammer fra, når jeg fanger den.
Den kunne vel komme fra flere steder i koden ??
Avatar billede koppelgaard Praktikant
16. maj 2007 - 20:25 #5
Jeg er kommet videre.
Vil nedenstående være en korrekt løsning?

public void Add(Kontakt k)
        {
           
            try
            {
                kontaktListe.Add(k.CprNr, k);
            }
            catch
            {
                throw new System.Exception("Two identical keys");
            }
        }

--------------------------------------------------------------------

  private void Btm_tilføjKontakt_Click(object sender, EventArgs e)
        {
           
            string cpr = this.textCpr.Text;
            string navn = this.textNavn.Text;
            string adr = this.textAdresse.Text;
            string tlf = this.textTelefon.Text;
            string email = this.textEmail.Text;
            try
            {
                con.KControl.OpretKontakt(cpr, navn, adr, tlf, email);

                MessageBox.Show("Kontakt blev oprettet", "Kontakt oprettelse", MessageBoxButtons.OK,
                    MessageBoxIcon.Asterisk);
            }
            catch(Exception excp ){
                MessageBox.Show("Kontakt kunne ikke oprettes", excp.Message ,MessageBoxButtons.OK,
                    MessageBoxIcon.Error);
            } 
           
           

        }
Avatar billede tomledk Nybegynder
17. maj 2007 - 10:05 #6
Der hvor du kaster din exception skal du være opmærksom på, at lige meget hvilken fejl der sker når du prøver at lave en Add, vil fejlen blive "Two identical keys". Dette er også tilfældet hvis kontaktListe eksempelvis er null.

Der hvor du fanger din exception ser umiddelbart fint ud.
Avatar billede koppelgaard Praktikant
18. maj 2007 - 07:49 #7
Hvordan håndtere jeg så det ?
Det rigtigste ville vel være at fange fejlen, der hvor objektet blev oprettet.
Men hvis man nu antog at man ville fange den i følgende kode hvordan ville man så gøre ?

public void Add(Kontakt k)
        {
           
            try
            {
                kontaktListe.Add(k.CprNr, k);
            }
            catch
            {
                throw new System.Exception("Two identical keys");
            }
        }
Avatar billede tomledk Nybegynder
18. maj 2007 - 09:53 #8
En god løsning ville være at lave en custom execption, eksempelsvis ContactIdenticalKeysException, som bliver kastet når du laver en Add til kontaktlisten. Og du behøver egentlig ikke lave en try, catch udenom din kontaktListe.Add, medmindre at den kaster en exception som du vil ændre på. Hver gang der sker en try, catch koster det performance.

Så du kunne gøre noget med:

public void Add(Kontakt k)
{
    bool doesContactExists = false; //TODO
    if(doesContactExists)
        throw new ContactIdenticalKeysException();

    kontaktListe.Add(k.CprNr, k);
}

public abstract class ContactIdenticalKeysException: ApplicationException
{
    public ContactIdenticalKeysException()
        : base(){}
    public ContactIdenticalKeysException(string message)
        : base("Two identical keys"){}
}


Der hvor du så fanger den har du mulighed for at lave en bedre catch:

try
{
  ....
}
catch(ContactIdenticalKeysException iExp)
{
  MsgBox...
}
catch(Exception exp)
{
  MsgBox...
}
Avatar billede koppelgaard Praktikant
18. maj 2007 - 12:18 #9
jeg er ikke helt med  på linien 

bool doesContactExists = false; //TODO
    if(doesContactExists)
        throw new ContactIdenticalKeysException();

Først sætter du doesContactExists til false
og lige efter, inden der er sket mere, tjekker du på, om den er true.
Kan den være andet end false?
Avatar billede koppelgaard Praktikant
02. juni 2007 - 13:57 #10
Selvom du ikke har besvaret mit sidste spørgsmål, må du hellere få point.
Her kommmer de.

Michael
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