Archief - C++ : Exceptions worden niet opgevangen / of ander probleem

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

adrianhates

Legacy Member
Yo,

Ik ben bezig met een kleine oefening voor school en ik probeer daar excepties in te verwerken. Het concept v/d oefening is very basic :

1) Bron bestand wordt gevraagd
2) Doel bestand wordt gevraagd
3) Bron bestand inlezen
4) Bron kopieren naar nieuw doel bestand

Ik dacht hier een exceptie te throwen als
a) Het invoerbestand niet bestaat of niet geopend kan worden
b) Het uitvoerbestand niet aangemaakt / geopend kan worden
c) Niet het einde van het bestand werd bereikt bij het kopieren.

Is het al juist om te denken dat een uitvoer bestand eventueel niet geopend kan worden? Bvb door onvoldoende rechten? Is het type van de catch misschien niet correct?

Als ik foutieve invoer doe, bvb "a" en "b" dan kopieert hij niet , maar toont ook de excepties niet.
Hierbij al vast mijn code. De bestanden die ik open zitten voor het simpele testgegeven in de zelfde folder als de .cpp en .exe file.

link naar pastebin indien gemakkelijker : [C++] C++ - Pastebin.com
Code:
#include <iostream>
#include <fstream>
using namespace std;

void openBestanden(string bron_bestand, string doel_bestand,
					ifstream & input_stream, ofstream & output_stream){
	
	input_stream.open(bron_bestand.c_str());
	if(!input_stream.is_open())
		throw "Bronbestand " + bron_bestand + " kon niet worden geopend!";
		
	output_stream.open(doel_bestand.c_str());
	if(!output_stream.is_open())
		throw "Doelbestand " + doel_bestand + " kon niet worden geopend!";
		
}


int main(){
	
	string bron_bestand;
	string doel_bestand;
	
	ifstream input_stream;
	ofstream output_stream;
	
	cout << "Geef het bronbestand op : " << endl;
	cin >> bron_bestand;
	
	cout << endl << "Geef naam nieuw doelbestand op : " << endl;
	cin >> doel_bestand;
	cout << endl;
		
	try{
		
		// open de bestanden en streams
		openBestanden(bron_bestand, doel_bestand, input_stream, output_stream);
		
		string line;
		int line_number = 1;
		getline(input_stream,line);
		while(!input_stream.fail()){
			
			cout << "Lijn nummer " << line_number << " met inhoud '" << line << "' wordt gekopieerd .. " << endl;
			output_stream << line << endl;
			line_number++;
			getline(input_stream,line);
			
		}
		
		if(!input_stream.eof())
			throw "Het bronbestand kon niet helemaal gekopieerd worden .. ";
		
		// close streams
		input_stream.close();
		output_stream.close();
		
	}
	catch(const char * ex){
		
		cout << ex << endl;
		
	}
	catch(...){
		
	}
		
	system("pause");
	return 0;
		
}

Thx!

forloRn_

Legacy Member
Wel, je throwt een string en je catcht een const char *. Lijkt me logisch dat dat niet werkt.

adrianhates

Legacy Member
A ma gvd! Ik dacht dus echt da da een Cstring was ..
Als ik de concatenatie weglaat werkt het wel ..

Lesson learned! Wel spijtig dat de compiler hier geen fout op geeft.

adrianhates

Legacy Member
blackrabbit zei:
Is toch ook geen fout?

Klopt maar bij
throw "Bronbestand " + bron_bestand + " kon niet worden geopend!";

moet ik
Code:
        catch(const string ex){
		
		cout << ex << endl;
		
	}
gebruiken blijkbaar.. Ik heb het net even getest ..

forloRn_

Legacy Member
Het is juist omdat je die concatenatie doet met een std::string dat je als resultaat een std::string krijgt: klikkie
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan