Avatar billede simsen Mester
30. april 2006 - 16:48 Der er 13 kommentarer og
2 løsninger

try/catch problemer

Hejsa

Jeg har en try/catch funktion på en regnemaskine. Skriver jeg eksempelvis Et (istedet for 1) i min tekstboks - fanger den generelle catch Exception den godt nok og kommer ud med min egen tekst "Du har lavet en fejl, som jeg ikke...".

Forsøger jeg at dividere med 0, vil jeg gerne fange den med
catch (DivideByZeroException err). Men istedet for at komme ud med en MessageBox - skriver den bare "INF" i lblResultat.Text (min label, hvor resultatet skulle komme til at stå).

Koden er her:

private void btnLighedstegn_Click(object sender, EventArgs e)
        {
            bool runFinally = true;

            try
            {
                double talEt = Convert.ToDouble(txtTalEt.Text);
                double talTo = Convert.ToDouble(txtTalTo.Text);

                if (lblFunktion.Text == "+")
                {
                    double resultat = talEt + talTo;
                    lblResultat.Text = resultat.ToString();
                }

                else if (lblFunktion.Text == "-")
                {
                    double resultat = talEt - talTo;
                    lblResultat.Text = resultat.ToString();
                }

                else if (lblFunktion.Text == "*")
                {
                    double resultat = talEt * talTo;
                    lblResultat.Text = resultat.ToString();
                }

                else if (lblFunktion.Text == "/")
                {
                    double resultat = talEt / talTo;
                    lblResultat.Text = resultat.ToString();
                }

                else
                {
                    lblResultat.Text = "Du har ikke indtastet nogen \noperator";
                }
            }
            catch (DivideByZeroException err)
            {
                runFinally = true;
                MessageBox.Show(err + "\n\nDu har forsøgt at dividere med 0");
            }
            catch (Exception err)
            {
                runFinally = true;
                MessageBox.Show(err + "\n\nDu har lavet en fejl, som jeg ikke aner hvad er, og du nok heller ikke");
            }
            finally
            {
                if (runFinally == true)
                {
                    txtTalEt.Text = "";
                    txtTalTo.Text = "";
                    lblFunktion.Text = "";
                }
            }
           
        }

mvh
simsen
Avatar billede snepnet Nybegynder
30. april 2006 - 16:51 #1
har du prøvet at debugge ned igennem og se hvad der sker?
mvh
Avatar billede simsen Mester
30. april 2006 - 16:57 #2
snepnet

Jeg kører den i debug mode - men den kommer ikke frem med nogle som helst warnings, errors eller messages - hvis det er det du mener?

mvh
simsen
Avatar billede snepnet Nybegynder
30. april 2006 - 17:03 #3
sæt et breakpoint på denne linie:
bool runFinally = true;
(du kan gøre det ved at stille dig på linien og trykke på F9).
så trykker du F5 for at køre med debugger, og eksekveringen stopper så på den linie.
du kan så steppe med F10/F11 så du kan se hvordan programmet eksekverer, og du kan inspicere variable etc.
mvh
Avatar billede arne_v Ekspert
30. april 2006 - 17:25 #4
hvis du læser docs på DivideByZeroException ser du:

Dividing a floating-point value by zero will result in either positive infinity, negative infinity, or Not-a-Number (NaN) according to the rules of IEEE 754 arithmetic. Floating-point operations never throw an exception. For more information, see Single and Double.

så det er som det skal være ...
Avatar billede simsen Mester
30. april 2006 - 17:29 #5
Det gør jeg og får en fejl ved koden:

                else if (lblFunktion.Text == "/")
                {
                    double resultat = talEt / talTo; //her skriver den infinity
                    lblResultat.Text = resultat.ToString();
                } // her skriver den "INF" i lblResultat.Text

Den springer fuldstændig
catch (DivideByZeroException err)
over.

Jeg kan kun se i hjælpen, at det har noget med frameworket at gøre. Kan du hjælpe mig - for ved ikke hvad jeg skal gøre nu.

mvh
simsen
Avatar billede simsen Mester
30. april 2006 - 17:37 #6
arne v

Tak skal du have - har lagt en if mere ind, der spørger om der står "INF" i lblResultat.Text, hvor jeg så laver MessageBox.

Den er din denne gang - smid et svar og det er dine points.

snepnet
Jeg laver lige et spørgsmål, angående debugging - vil gerne give dig lidt points for at guide mig igennem dette. Det er bestemt noget, jeg får meget brug for.

mvh simsen
Avatar billede nielle Nybegynder
30. april 2006 - 18:14 #7
Husk at du også skal tjekke for -INF (-1/0) og NaN (0/0).
Avatar billede simsen Mester
30. april 2006 - 18:21 #8
Bare smid svaret her snepnet. Jeg har lige lært, at jeg kan forhøje points tallet herinde :-)

simsen
Avatar billede simsen Mester
30. april 2006 - 18:23 #9
nielle

Tak - var klar over -INF men ikke NaN

mvh
simsen
Avatar billede snepnet Nybegynder
30. april 2006 - 18:33 #10
Jeg skal ikke have point for det med debugging :o)
mvh
Avatar billede snepnet Nybegynder
30. april 2006 - 18:34 #11
Men det var venligt - så tak for det :o)
mvh
Avatar billede simsen Mester
30. april 2006 - 18:40 #12
snepet

Det er mig der takker, jeg lærer en forfærdelig masse i dag jo :-)

mvh
simsen
Avatar billede arne_v Ekspert
30. april 2006 - 18:47 #13
if(Double.IsInfinity(x) || Double.IsNan(x))

vil jeg tro

og svar
Avatar billede arne_v Ekspert
30. april 2006 - 18:47 #14
om igen
Avatar billede simsen Mester
30. april 2006 - 22:30 #15
Jeg takker :-)
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