// excepciones.cpp - Tratamiento de excepciones
#include <string>
#include <iostream>
using namespace std;

class EValorNegativo
{
    string mensajeDeError;
  public:
    EValorNegativo(string mensaje = "error")
    {
      mensajeDeError = mensaje;
    }
    string what() const { return mensajeDeError; }
  // ...
};

class CDemo
{
    int x;
  public:
    CDemo()
    {
      x = 0;
      cout << "Se construye un objeto CDemo" << endl;
    }
    
    ~CDemo()
    {
      cout << "Se destruye un objeto CDemo" << endl;
    }

    void AsignarValor(int v)
    {
      if (v < 0)
      {
        cout<< "Ocurrió una excepción EValorNegativo\n";
        throw EValorNegativo("EValorNegativo");
      }
      else if (v == 0)
      {
        cout<< "Ocurrió una excepción; valor cero\n";
        throw "valor cero";
      }
      x = v;
    }

  // ...
};

void MiFuncion(int);

int main()
{
  int a = 0;
  cout << "a = "; cin >> a;
  cout << "Se ejecuta main\n";
  try
  {
    cout << "Se llama a MiFuncion desde el bloque try\n";
    MiFuncion(a);
    cout << "Finaliza el bloque try\n";
  }
  catch(EValorNegativo& e)
  {
    cout << "Se captura la excepción: ";
    cout << e.what() << endl;
  }
  catch(const char *s)
  {
    cout << s << endl;
  }
  cout << "Se reanuda la ejecución de main\n";

  // ...
  
  system("pause");
}

void MiFuncion(int x)
{
  cout << "Se ejecuta MiFuncion\n";
  CDemo objD;
  objD.AsignarValor(x);
  // ...
  cout << "Continua la ejecución de MiFuncion\n";
  // ...
}

