Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> C Taal

Afhandeling van C++-uitzonderingen

Een uitzondering is een probleem dat zich voordoet tijdens de uitvoering van een programma. Een C++-uitzondering is een reactie op een uitzonderlijke omstandigheid die zich voordoet terwijl een programma draait, zoals een poging om te delen door nul.

Uitzonderingen bieden een manier om de controle over te dragen van het ene deel van een programma naar het andere. De afhandeling van C++-uitzonderingen is gebaseerd op drie sleutelwoorden:try, catch, en gooi .

  • gooi − Een programma genereert een uitzondering wanneer zich een probleem voordoet. Dit doe je met een worp zoekwoord.

  • vang − Een programma vangt een uitzondering op met een uitzonderingshandler op de plaats in een programma waar u het probleem wilt oplossen. De vangst trefwoord geeft het opvangen van een uitzondering aan.

  • probeer − Een probeer blok identificeert een codeblok waarvoor bepaalde uitzonderingen worden geactiveerd. Het wordt gevolgd door een of meer vangblokken.

Ervan uitgaande dat een blok een uitzondering genereert, vangt een methode een uitzondering op met een combinatie van de try en vang trefwoorden. Om de code wordt een try/catch-blok geplaatst dat een uitzondering zou kunnen genereren. Code binnen een try/catch-blok wordt beschermde code genoemd, en de syntaxis voor het gebruik van try/catch is als volgt −

try {
   // protected code
} catch( ExceptionName e1 ) {
   // catch block
} catch( ExceptionName e2 ) {
   // catch block
} catch( ExceptionName eN ) {
   // catch block
}

U kunt meerdere vangsten opsommen instructies om verschillende soorten uitzonderingen op te vangen voor het geval uw probeert blok genereert meer dan één uitzondering in verschillende situaties.

Uitzonderingen gooien

Uitzonderingen kunnen overal binnen een codeblok worden gegooid met throw uitspraak. De operand van de throw-instructie bepaalt een type voor de uitzondering en kan elke expressie zijn en het type van het resultaat van de expressie bepaalt het type exception dat wordt gegenereerd.

Hieronder volgt een voorbeeld van het genereren van een uitzondering wanneer de voorwaarde wordt gedeeld door nul −

double division(int a, int b) {
   if( b == 0 ) {
      throw "Division by zero condition!";
   }
   return (a/b);
}

Uitzonderingen opvangen

De vangst blokkeren na de probeer blok vangt elke uitzondering. U kunt specificeren welk type uitzondering u wilt opvangen en dit wordt bepaald door de uitzonderingsverklaring die tussen haakjes wordt weergegeven na het trefwoord catch.

try {
   // protected code
} catch( ExceptionName e ) {
  // code to handle ExceptionName exception
}

Bovenstaande code ondervangt een uitzondering van ExceptionName type. Als u wilt specificeren dat een catch-blok elk type uitzondering moet verwerken dat in een try-blok wordt gegooid, moet u een ellips, ..., tussen de haakjes plaatsen die de uitzonderingsdeclaratie als volgt omsluiten −

try {
   // protected code
} catch(...) {
  // code to handle any exception
}

Het volgende is een voorbeeld, waarbij een uitzondering door deling door nul wordt gegenereerd en we vangen het op in het catch-blok.

Live demo
#include <iostream>
using namespace std;

double division(int a, int b) {
   if( b == 0 ) {
      throw "Division by zero condition!";
   }
   return (a/b);
}

int main () {
   int x = 50;
   int y = 0;
   double z = 0;
 
   try {
      z = division(x, y);
      cout << z << endl;
   } catch (const char* msg) {
     cerr << msg << endl;
   }

   return 0;
}

Omdat we een uitzondering maken van het type const char* , dus terwijl we deze uitzondering opvangen, moeten we const char * gebruiken in het catch-blok. Als we bovenstaande code compileren en uitvoeren, zou dit het volgende resultaat opleveren −

Division by zero condition!

C++ standaard uitzonderingen

C++ biedt een lijst met standaarduitzonderingen gedefinieerd in die we kunnen gebruiken in onze programma's. Deze zijn gerangschikt in een hiërarchie van ouder-kindklassen die hieronder wordt weergegeven −

Hier is de kleine beschrijving van elke uitzondering die in de bovenstaande hiërarchie wordt genoemd −

Zr.Nee Uitzondering en beschrijving
1

std::uitzondering

Een uitzondering en bovenliggende klasse van alle standaard C++ uitzonderingen.

2

std::bad_alloc

Dit kan worden gegooid door nieuwe .

3

std::bad_cast

Dit kan worden gegenereerd door dynamic_cast .

4

std::bad_exception

Dit is een handig apparaat om onverwachte uitzonderingen in een C++-programma af te handelen.

5

std::bad_typeid

Dit kan worden gegooid door typeid .

6

std::logic_error

Een uitzondering die theoretisch kan worden gedetecteerd door de code te lezen.

7

std::domain_error

Dit is een uitzondering die optreedt wanneer een wiskundig ongeldig domein wordt gebruikt.

8

std::invalid_argument

Dit wordt gegenereerd vanwege ongeldige argumenten.

9

std::length_error

Dit wordt gegenereerd wanneer een te grote std::string wordt gemaakt.

10

std::out_of_range

Dit kan worden gegenereerd door de 'at'-methode, bijvoorbeeld een std::vector en std::bitset<>::operator[]().

11

std::runtime_error

Een uitzondering die theoretisch niet kan worden gedetecteerd door de code te lezen.

12

std::overflow_error

Dit wordt gegooid als er een wiskundige overloop optreedt.

13

std::range_error

Dit gebeurt wanneer u een waarde probeert op te slaan die buiten het bereik ligt.

14

std::underflow_error

Dit wordt gegooid als er een wiskundige onderstroom optreedt.

Nieuwe uitzonderingen definiëren

U kunt uw eigen uitzonderingen definiëren door uitzondering . over te nemen en te negeren klasse functionaliteit. Hieronder volgt het voorbeeld, dat laat zien hoe u std::exception class kunt gebruiken om uw eigen exception op een standaard manier te implementeren −

Live demo
#include <iostream>
#include <exception>
using namespace std;

struct MyException : public exception {
   const char * what () const throw () {
      return "C++ Exception";
   }
};
 
int main() {
   try {
      throw MyException();
   } catch(MyException& e) {
      std::cout << "MyException caught" << std::endl;
      std::cout << e.what() << std::endl;
   } catch(std::exception& e) {
      //Other errors
   }
}

Dit zou het volgende resultaat opleveren −

MyException caught
C++ Exception

Hier, wat() is een openbare methode die wordt geleverd door een uitzonderingsklasse en is overschreven door alle onderliggende uitzonderingsklassen. Dit retourneert de oorzaak van een uitzondering.


C Taal

  1. C++-operators
  2. C++ Opmerkingen
  3. C++-klassesjablonen
  4. C Bestandsverwerking
  5. Afhandeling van Java-uitzonderingen
  6. C++ Exception Handling:Try, Catch, Throw Voorbeeld
  7. Python Exception Handling:probeer, vang, eindelijk &verhoog [Voorbeeld]
  8. C - Foutafhandeling
  9. C++-overzicht
  10. C++-constanten/letters
  11. Operatoren in C++