C++/Development/Exception

Материал из C\C++ эксперт
Перейти к: навигация, поиск

An exception can be thrown from outside the try block

 
#include <iostream>
using namespace std;
void myFunction(int test)
{
  cout << "Inside myFunction, test is: " << test << "\n";
  if(test) throw test;
}
int main()
{
  cout << "Start\n";
  try { 
    cout << "Inside try block\n";
    myFunction(0);
    myFunction(1);
    myFunction(2);
  }
  catch (int i) { 
    cout << "Caught an exception -- value is: ";
    cout << i << "\n";
  }
  cout << "End";
  return 0;
}


A try/catch can be inside a function other than main().

 
#include <iostream>
using namespace std;

void myFunction(int test)
{
  try{
    if(test) 
      throw test;
  }
  catch(int i) {
    cout << "Caught One!  Ex. #: " << i << "\n";
  }
}
int main()
{
  cout << "start\n";
  myFunction(1);
  myFunction(2);
  myFunction(0);
  myFunction(3);
  cout << "end";
  return 0;
}


Catch exception: int i

 
#include <iostream>
using namespace std;
int main()
{
  cout << "Start\n";
  try { 
    cout << "Inside try block\n";
    cout << "Still inside try block\n";
  }catch (int i) { // catch an error
    cout << "Caught an exception and value is: ";
    cout << i << endl;
  }
  cout << "End";
  return 0;
}


Different types of exceptions can be caught.

 
#include <iostream>
using namespace std;

void myFunction(int test)
{
  try{
    if(test) 
       throw test;
    else 
       throw "Value is zero";
  }catch(int i) {
    cout << "Caught Exception #: " << i << "\n";
  }catch(const char *str) {
    cout << "Caught a string: ";
    cout << str << "\n";
  }
}
int main()
{
  cout << "Start\n";
  myFunction(1);
  myFunction(2);
  myFunction(0);
  myFunction(3);
  cout << "End";
  return 0;
}


Handle exceptions thrown by new.

 
#include <iostream>
#include <new>
using namespace std;
int main()
{
  int *p, i;
   try { 
     p = new int[32]; // allocate memory for 32-element int array
   } catch (bad_alloc xa) {
     cout << "Allocation failure.\n";
     return 1;
  }
  for(i = 0; i <32; i++) 
     p[i] = i;
  for(i = 0; i <32; i++) 
     cout << p[i] << " ";
  delete [] p; // free the memory
  return 0;
}


Matching Any Exception

  
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
#include <stdexcept>
using namespace std;
void readIntegerFile(const string& fileName, vector<int>& dest)
{
  ifstream istr;
  int temp;
  istr.open(fileName.c_str());
  if (istr.fail()) {
    throw invalid_argument("");
  }
  while (istr >> temp) {
    dest.push_back(temp);
  }
  if (istr.eof()) {
    istr.close();
  } else {
    istr.close();
    throw runtime_error("");
  }
}
int main(int argc, char** argv)
{
  vector<int> myInts;
  const string fileName = "IntegerFile.txt";
  try {
    readIntegerFile(fileName, myInts);
  } catch (...) {
    cerr << "Error reading or opening file " << fileName << endl;
    exit (1);
  }
  for (size_t i = 0; i < myInts.size(); i++) {
    cout << myInts[i] << " ";
  }
  cout << endl;
  return (0);
}


No Exception Handling

  
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
using namespace std;
void readIntegerFile(const string& fileName, vector<int>& dest)
{
  ifstream istr;
  int temp;
  istr.open(fileName.c_str());
  while (istr >> temp) {
    dest.push_back(temp);
  }
}
int main(int argc, char** argv)
{
  vector<int> myInts;
  const string fileName = "IntegerFile.txt";
  readIntegerFile(fileName, myInts);
  for (size_t i = 0; i < myInts.size(); i++) {
    cout << myInts[i] << " ";
  }
  cout << endl;
  return (0);
}


Restricting function throw types.

 
#include <iostream>
using namespace std;

void myFunction(int test) throw(int, char, double)
{
  if(test==0) 
     throw test;                // throw int
  if(test==1) 
     throw "a";                 // throw char
  if(test==2) 
     throw 333.23;              // throw double
}
int main()
{
  cout << "start\n";
  try{
    myFunction(0);                       
  }
  catch(int i) {
    cout << "Caught an integer\n";
  }
  catch(char c) { 
    cout << "Caught char\n";
  }
  catch(double d) { 
    cout << "Caught double\n";
  }
  try{
    myFunction(1);                       
  }
  catch(int i) {
    cout << "Caught an integer\n";
  }
  catch(char c) { 
    cout << "Caught char\n";
  }
  catch(double d) { 
    cout << "Caught double\n";
  }
  try{
    myFunction(2);                       
  }
  catch(int i) {
    cout << "Caught an integer\n";
  }
  catch(char c) { 
    cout << "Caught char\n";
  }
  catch(double d) { 
    cout << "Caught double\n";
  }

  cout << "end";
  return 0;
}


Rethrowing an Exception

 
#include <iostream>
using namespace std;
void myFunction()
{
  try {
    throw "hello";                // throw a char *
  }
  catch(const char *) {           // catch a char *
    cout << "Caught char * inside myFunction\n";
    throw ;                       // rethrow char * out of function
  }
}
int main()
{
  cout << "Start\n";
  try{
    myFunction();
  }
  catch(const char *) {
    cout << "Caught char * inside main\n";
  }
  cout << "End";
  return 0;
}


Terminate Handler

  
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
#include <stdexcept>
#include <exception>
using namespace std;
void readIntegerFile(const string& fileName, vector<int>& dest)
{
  ifstream istr;
  int temp;
  istr.open(fileName.c_str());
  if (istr.fail()) {
    throw invalid_argument("");
  }
  while (istr >> temp) {
    dest.push_back(temp);
  }
  if (istr.eof()) {
    istr.close();
  } else {
    istr.close();
    throw runtime_error("");
  }
}
void myTerminate()
{
  cout << "Uncaught exception!\n";
  exit(1);
}
int main(int argc, char** argv)
{
  vector<int> myInts;
  const string fileName = "IntegerFile.txt";
  set_terminate(myTerminate);
  readIntegerFile(fileName, myInts);
  for (size_t i = 0; i < myInts.size(); i++) {
    cerr << myInts[i] << " ";
  }
  cout << endl;
  return (0);
}


Throw and catch an exception inside a function

 
#include <iostream>
#include <cstdlib>
using namespace std;
double divide(double a, double b)
{
  try {
    if(!b) throw(b);
  }
  catch(double) {
    cout << "Cannot divide by zero.\n";
    exit(1);
  }
  return a/b;
}
int main()
{
  cout << divide(10.0, 2.5) << endl;
  cout << divide(10.0, 0.0);
  return 0;
}


Uses catch(...) to catch all exceptions

 

#include <iostream>
using namespace std;
void myFunction(int test)
{
  try{
    if(test==0)  // throw int
       throw test;   
    if(test==1)  // throw char
       throw "a";    
    if(test==2)  // throw double
       throw 123.23; 
  } catch(int i) { // catch an int exception
    cout << "Caught " << i << "\n";
  } catch(...) {   // catch all other exceptions
    cout << "Caught One!\n";
  }
}
int main()
{
  cout << "start\n";
  myFunction(0);
  myFunction(1);
  myFunction(2);
  cout << "end";
  return 0;
}