[C++] divide by 0 error wordt niet gevangen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hey, ik heb een vermoedelijk simpele vraag naar aanleiding van een tutorial die ik aan het volgen ben. C++ is me niet bekend en ik zat te kijken naar iets dat errors zou moeten vangen:

try{
cout << "Please enter a number. \n";
cin >> localdivide.dividend;
cout << "Please enter another number.\n";
cin >> localdivide.divisor;
localdivide.answer = localdivide.dividend/localdivide.divisor;
cout << localdivide.dividend << "divided by " ;
cout << localdivide.divisor << " is " << localdivide.answer;
} catch(...){
cout << "an error occurred!";
}

Helaas levert het invoeren van een letter of delen door nul geen error op. Er komen enkel uitkomsten als inf en ook een keer nan uit. Een constructie met "throw 0" en "catch (int i)" levert het zelfde probleem.
Weet iemand hoe ik het wel moet doen? Bij voorbaat dank.

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Die zul je zelf moeten throwen voordat je die kan catchen.

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • CoolGamer
  • Registratie: Mei 2005
  • Laatst online: 13:41

CoolGamer

What is it? Dragons?

Het ziet er naar uit dat je met floating-point numbers aan het rekenen bent. Die geven geen error op het moment dat je die door 0 deelt, maar geeft de waarde Inf/NaN (not a number) terug.

¸.·´¯`·.¸.·´¯`·.¸><(((º>¸.·´¯`·.¸><(((º>¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸<º)))><¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ah, dank aan beiden!

Acties:
  • 0 Henk 'm!

  • remco_k
  • Registratie: April 2002
  • Laatst online: 14:46

remco_k

een cassettebandje was genoeg

Als toevoeging en los van het probleem, catch(...) is een soort catch all, en vangt zo goed als alles op. Maar je kunt niet aan de gebruiker tonen wat er nou misging en ook debuggend zal dat niet veel info geven.

Je kan beter catch (Exception &e) doen. In e.Message staat de foutmelding in een AnsiString.
(Tenminste, in Borlands VCL C++). Misschien dat jij iets anders moet catchen dan omdat je wellicht geen Boland VCL gebruikt, maar het tonen van de foutmelding aan de gebruiker is wel van belang, in sommige gevallen.

Alles kan stuk.


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

std::exception is de standaard, met e.what() als std::string voor de omschrijving

Acties:
  • 0 Henk 'm!

  • Amotea
  • Registratie: Mei 2004
  • Laatst online: 23-01 17:45
Ik geloof niet dat dit soort excepties te vangen zijn met (...), althans niet als je VS2005 of hoger gebruikt, omdat het geen C++ excepties zijn maar Win32 exceptions (net als access violations). Je moet hiervoor eerst e.e.a. doen: http://msdn.microsoft.com...ary/5z4bw5h5(VS.100).aspx en http://www.experts-exchan...uages/CPP/Q_23284007.html gaan hierover.

(edit: voor het geval die sites ooit niet meer bestaan, je moet dus _set_se_translator() gebruiken)

[ Voor 11% gewijzigd door Amotea op 27-06-2009 17:28 ]


Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
CodeCaster schreef op zaterdag 27 juni 2009 @ 15:04:
Die zul je zelf moeten throwen voordat je die kan catchen.
Nee - het exception gedrag voor floating point is instelbaar via het"floating point control word". De reden dat je geen exception krijgt is vrijwel zeker dat het floating point control word nog op de default waarde staat, en dan krijg je geen exceptions. Maar als je de EM_ZERODIVIDE bit zou zetten, dan krijg je wel een (Win32) exception. Het hangt vervolgens van je C++ compiler af of die met catch(...) gevangen wordt.

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


Acties:
  • 0 Henk 'm!

  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

zoals hierboven ook al verklaard, floating point exceptions staan standaard uit. mocht je je verder willen verdiepen in exceptions op windows, kan je beter zoeken op SEH (structured exception handling, de "officiele" term van MS) in plaats van Win32 exceptions, dan krijg je nuttige MSDN artikelen.

echter, in bovenstaand geval kan je volgens mij beter een check doen op divisor, om te kijken of het wel een bruikbaar nummer is (niet buitengewoon groot of klein)

-niks-


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt voor alle reacties.
Ik denk dat ik het op checks houdt, die vervolgens een int throwen. Die wordt gevangen en afhankelijk van het getal wordt er actie ondernomen.
Ik hou het liever zo cross-platform als mogelijk, hoewel Java dan wellicht handiger is (niet echt low level control nodig). Maargoed, het was een algemene vraag :)
Pagina: 1