• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Stosowanie wyjątków w C++

Object Storage Arubacloud
0 głosów
443 wizyt
pytanie zadane 6 kwietnia 2019 w C i C++ przez Sic Dyskutant (8,510 p.)

Witam

Uczę się wykorzystywać wyjątki w niewielkich programach. Błąd polega na odniesieniu się do "catch", mimo tego że nie wystąpił odpowiedni wyjątek.

Oto kod:

#include <fstream>
#include <iostream>
#include <Windows.h>
#include <string>

void openFile (std::string);
void cryptionFile(std::ofstream);

int main()
{
	std::string fileName;
	std::cout << "Wprowadz nazwe pliku: ";
	std::getline(std::cin, fileName);
	openFile(fileName);

	try
	{
		openFile(".dll");
	}
	catch (const char * s)
	{
		int sign ;
		std::cout << s << std::endl;
		std::cout << "1. Zakoncz.\n2. Wprowadz dane\n";
		std::cin >> sign;
		switch (sign)
		{
			case 1:
				break;
			
			case 2:
			{
				std::cout << "Nazwa nowego pliku: ";
				std::getline(std::cin, fileName);
				openFile(fileName);
			}
		}
	}

	system("pause");
	return 0;
}

void openFile(std::string file)
{
	std::string text;
	std::ifstream inFile;
	inFile.open(file.c_str());
	
	if (inFile.good())
	{
		std::cout << "Plik otwarty.\n";
		std::getline(inFile, text);
		std::cout << text << std::endl;
		inFile.close();
	}
	
	else if(file.empty()) // działa bez wyjątku
		throw "Wypelnij pole!\n";
	else
	{
		std::cout << "Plik nieistnieje!\n";
		system("pause");
		exit(0);
	}
}

1. Jeżeli wprowadzę "haslo.txt":

  • pojawia się informacja o otwarciu pliku oraz zawartość, co jest wskazane
  • jednak dodatkowo wykonuje się "else" funkcji (informacja o nieistniejącym pliku)

2. Jeżeli wprowadzę "<enter>" pojawia się błąd wyjątku (?)

 

2 odpowiedzi

+1 głos
odpowiedź 6 kwietnia 2019 przez niezalogowany
wybrane 7 kwietnia 2019 przez Sic
 
Najlepsza

Chyba to jest problemem:

openFile(fileName); 
 
    try
    {
        openFile(".dll"); // ???
    }

Nie rozumiem po co otwierasz jakiś plik .dll i jednocześnie nie łapiesz wyjątku z pierwszego wywołania funkcji.

komentarz 6 kwietnia 2019 przez Sic Dyskutant (8,510 p.)
Otwieram ? W takim razie try otwiera plik czy ma za zadanie wskazać przykład, błędu ?

Pytam bo nie mogę pojąć wyjątków.
komentarz 6 kwietnia 2019 przez niezalogowany

Nie rozumiem. Wskazałaś dwie sytuacje które są logiczne:

1. Zakładamy, że istnieje plik "haslo.txt" i nie istnieje ".dll". Otwierasz plik "haslo.txt" i dane zostają wypisane. Następnie wykonujesz znów wykonujesz funkcję openFile dla pliku ".dll", który nie istnieje. Program się kończy (exit(0)).

2. Nazwa pliku jest pusta. Funkcja openFile rzuca wyjątek. Nie zostaje on złapany, ponieważ nie znajduje się w bloku try{}

Czy chciałeś zrobić coś takiego:


	try
	{
        openFile(fileName);
		//openFile(".dll"); // ???
	}
komentarz 6 kwietnia 2019 przez Sic Dyskutant (8,510 p.)
Tak dokładnie o to mi chodziło.
komentarz 6 kwietnia 2019 przez Sic Dyskutant (8,510 p.)
Czyli jak dokładnie działa try ? Do niego wprowadza się błędy ?
komentarz 6 kwietnia 2019 przez Secrus Nałogowiec (32,880 p.)
W try umieszczasz kod, który może rzucić wyjątkiem, a w catch kod, który ma się wykonać w razie wystąpienie wyjątku
+1 głos
odpowiedź 6 kwietnia 2019 przez j23 Mędrzec (194,920 p.)

Czytam, czytam i nie rozumiem opisu twojego problemu. Może taki dzień...

Dwie uwagi:

  • Linia 64: nie używaj w C++ funkcji exit, od tego są właśnie wyjątki. Zresztą dlaczego funkcja otwierająca plik zamyka program? To nie jej rola.
  • Linia 25 w połączeniu z 34: operator >> przeczyta liczbę, ale nie ściągnie znaku końca linii, co spowoduje, że std::getline przeczyta pustą linię.

Podobne pytania

0 głosów
1 odpowiedź 1,425 wizyt
pytanie zadane 14 marca 2019 w Java przez periedynek Obywatel (1,320 p.)
0 głosów
1 odpowiedź 1,057 wizyt
pytanie zadane 9 grudnia 2018 w Java przez mn130496 Gaduła (3,530 p.)
0 głosów
2 odpowiedzi 480 wizyt
pytanie zadane 3 stycznia 2022 w C# przez KonDZIKs Bywalec (2,770 p.)

92,555 zapytań

141,403 odpowiedzi

319,553 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...