Własne wyjątki w try-catch

0

Witam, fragment kodu:
title
W tym fragmencie chodzi o to że jeśli jedna z tych danych nie jest liczbą to program kończy działanie.
Jest to zapisane bardzo nieelegancko, lecz nie wiem jak można tworzyć try-catcha z własnymi wyjątkami na przykład na coś takiego co tutaj mam. Czytałem po wielu stronach, są jakieś throw i throws, lecz robiąc coś takiego nie widzę w ogóle gdzie ten mój warunek ze wskazaniem na puste pole mogę gdzieś wpisać. Mógłby ktoś mi to wytłumaczyć krok po kroku co powinienem zrobić?

1

Jesteś pewny, że chcesz tworzyć własną klasę wyjątków? Jesteś pewny, że chcesz rzucać wyjątki w przypadku błędnych argumentów wejściowych?

Dlaczego uważasz, że zawartość zmiennej tekst poinformuje Cię o poprawności konwersji? Funkcja strtod w przypadku braku poprawnej konwersji zwróci wartość 0.0, albo ustawi errno na wartość ERANGE;

Przeanalizuj sobie ten kod:

#include <iostream>
#include <cerrno>

enum {a, b, c, d, sinus, argSize};

int main(int argc, char *argv[]) {

  if (argc != argSize + 1) {
    std::cerr << "[ERROR] Wrong argument list. Should be: " << argSize + 1 << " , but is: " << argc << ".\n";
    exit(EXIT_FAILURE);
  }

  double dataIN[argSize];

  for (size_t i = 0; i < argSize && errno != ERANGE; ++i) {
    dataIN[i] = strtod(argv[i + 1], nullptr);
    if (dataIN[i] == 0.0) {
      std::cerr << "[WARNING] Possibly conversion error for argument " << i << ": " << argv[i + 1] << ".\n";
    }
  }

  if (errno == ERANGE) {
    std::cerr << "[ERROR] One of arguments conversion failure.\n";
    exit(EXIT_FAILURE);
  }

  std::cout << "Arguments: \n";
  std::cout << dataIN[a] << std::endl;
  std::cout << dataIN[b] << std::endl;
  std::cout << dataIN[c] << std::endl;
  std::cout << dataIN[d] << std::endl;
  std::cout << dataIN[sinus] << std::endl;

  return EXIT_SUCCESS;
}
0

Teraz widzę że zamiast tych pięciu deklaracji mogłem zrobić deklarację tablicy i wtedy nie będzie takiego problemu. Natomiast o tym throw-ie chciałbym się jednak nauczyć, na wikipedii jest taki kod:

        #include<iostream>
        #include<string>
        #include<cmath>
        using namespace std;
        double Dziel(double, double);
        int main()
        {
            try
            {
                Dziel(10, 0);
            }
            catch(string w)
            {
                cout<<"Wyjatek: "<<w;
            }
            cin.get();
            return 0;
         }
         double Dziel(double a, double b) //funkcja zwraca iloraz a / b
        {
            if (b == 0)    {
                 string wyjatek = "dzielenie przez zero!";
                 throw wyjatek;
            }
            return a / b;
        }

Co się dzieje w catchu oraz co się dzieje gdy w funkcji Dziel, b jest równe 0?

0

http://melpon.org/wandbox/permlink/b7bgHa8AGwBmXMG3

bool ParseArgAsDouble(int argc, const char *argv[], vector<double>& result)
{
	result.clear();
	for (int i=1; i<argc; ++i)
	{
		istringstream argValue(argv[i]);
		double x;
		if (argValue >> x && argValue.eof())
		{
			result.push_back(x);
		}
		else
		{
			return false;
		}
	}
	return true;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1