<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[ios_base::failure Ausnahme nach deaktivierung der Ausnahmen für den Stream]]></title><description><![CDATA[<p>Hallo Leuts.</p>
<p>Ich tritt folgende Ausnahme auf:</p>
<p>terminate called after throwing an instance of 'std::ios_base::failure'<br />
what(): basic_ios::clear</p>
<p>Jedoch dachte ich, ich hätte die Ausnahmen deaktiviert mit</p>
<pre><code>void parser_base::run(){
	std::istream::iostate iostate = is.exceptions();
	is.exceptions(std::istream::goodbit);
	first();
	is.exceptions(iostate);
}
</code></pre>
<p>Ist hier was falsch?</p>
<p>Aufgerufen wird das ganze hier:</p>
<pre><code>int main(int argc, char **argv){
	if(1 &lt; argc &amp;&amp; argc &lt; 3){
		std::ifstream ifs;
		ifs.exceptions(std::ifstream::failbit | std::ifstream::badbit);

		try{
			ifs.open(argv[1]);
		}catch(std::ifstream::failure &amp;e){
			std::cerr &lt;&lt; &quot;Couldn't open source file &quot; &lt;&lt; argv[1] &lt;&lt; std::endl;
			exit(EXIT_FAILURE);
		}

		fifth_interpreter interpreter(ifs);

		//try{
			interpreter.run();
			ifs.close();
		//}catch(std::exception &amp;e){
		//	std::cerr &lt;&lt; &quot;Parsing error&quot; &lt;&lt; std::endl;
		//}

	}else
		std::cerr &lt;&lt; &quot;Wrong number of arguments&quot; &lt;&lt; std::endl;

	return EXIT_SUCCESS;
}
</code></pre>
<p>Danke,</p>
<p>Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/291485/ios_base-failure-ausnahme-nach-deaktivierung-der-ausnahmen-für-den-stream</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 15:57:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/291485.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 19 Aug 2011 15:49:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to ios_base::failure Ausnahme nach deaktivierung der Ausnahmen für den Stream on Fri, 19 Aug 2011 15:49:40 GMT]]></title><description><![CDATA[<p>Hallo Leuts.</p>
<p>Ich tritt folgende Ausnahme auf:</p>
<p>terminate called after throwing an instance of 'std::ios_base::failure'<br />
what(): basic_ios::clear</p>
<p>Jedoch dachte ich, ich hätte die Ausnahmen deaktiviert mit</p>
<pre><code>void parser_base::run(){
	std::istream::iostate iostate = is.exceptions();
	is.exceptions(std::istream::goodbit);
	first();
	is.exceptions(iostate);
}
</code></pre>
<p>Ist hier was falsch?</p>
<p>Aufgerufen wird das ganze hier:</p>
<pre><code>int main(int argc, char **argv){
	if(1 &lt; argc &amp;&amp; argc &lt; 3){
		std::ifstream ifs;
		ifs.exceptions(std::ifstream::failbit | std::ifstream::badbit);

		try{
			ifs.open(argv[1]);
		}catch(std::ifstream::failure &amp;e){
			std::cerr &lt;&lt; &quot;Couldn't open source file &quot; &lt;&lt; argv[1] &lt;&lt; std::endl;
			exit(EXIT_FAILURE);
		}

		fifth_interpreter interpreter(ifs);

		//try{
			interpreter.run();
			ifs.close();
		//}catch(std::exception &amp;e){
		//	std::cerr &lt;&lt; &quot;Parsing error&quot; &lt;&lt; std::endl;
		//}

	}else
		std::cerr &lt;&lt; &quot;Wrong number of arguments&quot; &lt;&lt; std::endl;

	return EXIT_SUCCESS;
}
</code></pre>
<p>Danke,</p>
<p>Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2108165</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2108165</guid><dc:creator><![CDATA[Martin Kalbfuß]]></dc:creator><pubDate>Fri, 19 Aug 2011 15:49:40 GMT</pubDate></item><item><title><![CDATA[Reply to ios_base::failure Ausnahme nach deaktivierung der Ausnahmen für den Stream on Fri, 19 Aug 2011 15:52:51 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/u109509" rel="nofollow">SeppJ</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/f10" rel="nofollow">C (C89 und C99)</a> in das Forum <a href="http://www.c-plusplus.net/forum/f15" rel="nofollow">C++ (auch C++0x)</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/39405" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2108166</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2108166</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Fri, 19 Aug 2011 15:52:51 GMT</pubDate></item><item><title><![CDATA[Reply to ios_base::failure Ausnahme nach deaktivierung der Ausnahmen für den Stream on Fri, 19 Aug 2011 15:59:05 GMT]]></title><description><![CDATA[<p>Und deine Exception wird auch sicher in first(); geworfen?</p>
<p>Ansonsten: Zeig mal ein vollständigeres Beispiel. Ich sehe jede Menge Code in dem Exceptions muter mal aktiviert und mal deaktiviert werden, ohne klaren Programmverlauf. Ich bin mir gar nicht sicher, an welcher Stelle du dein Problem hast und über welchen Pfad du dort hingekommen bist. Du selbst vermutlich auch nicht, sonst wäre das Problem ja nicht da <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2108168</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2108168</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 19 Aug 2011 15:59:05 GMT</pubDate></item><item><title><![CDATA[Reply to ios_base::failure Ausnahme nach deaktivierung der Ausnahmen für den Stream on Fri, 19 Aug 2011 16:17:26 GMT]]></title><description><![CDATA[<p>Hier die Konstruktoren die for run aufgerufen werden. Die exceptions werden nicht wieder aktiviert. Ansonsten gibt's keine weiteren Aufrufe dazwischen.</p>
<pre><code>fifth_interpreter::fifth_interpreter(std::istream &amp;is)
	: parser_base(is),
	  stack(64)
{}

parser_base::parser_base(std::istream &amp;is)
	: is(is),
	  row(0),
	  col(0)
{
	next_token();
}
</code></pre>
<p>Und hier noch next_token(), welches die Ausnahme wirft:</p>
<pre><code>void parser_base::next_token(){
	token = is.get();
	check_token('\n') ? row++, col = 0 : col++;
}
[code]

Diese funktion wird mehrmals innerhalb first aufgerufen.

Wenn ich run() in einen try catch block stelle. Wird die Ausnahme auch aufgefangen. Erstaunlicherweiße gib't e.what() nichts zurück.

[code]
int main(int argc, char **argv){
	if(1 &lt; argc &amp;&amp; argc &lt; 3){
		std::ifstream ifs;
		ifs.exceptions(std::ifstream::failbit | std::ifstream::badbit);

		try{
			ifs.open(argv[1]);
		}catch(std::ifstream::failure &amp;e){
			std::cerr &lt;&lt; &quot;Couldn't open source file &quot; &lt;&lt; argv[1] &lt;&lt; std::endl;
			exit(EXIT_FAILURE);
		}

		fifth_interpreter interpreter(ifs);

		try{
			interpreter.run();
		}catch(std::exception &amp;e){
			e.what();
			std::cerr &lt;&lt; &quot;Parsing error&quot; &lt;&lt; std::endl;
		}

		ifs.close();

	}else
		std::cerr &lt;&lt; &quot;Wrong number of arguments&quot; &lt;&lt; std::endl;

	return EXIT_SUCCESS;
}
</code></pre>
<p>Die einzige Ausgabe die ich erhalte is dann &quot;Parsing error&quot;, obwohl er vorher folgendes behauptet hat:</p>
<p>what(): basic_ios::clear</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Hier nochmal beide Klassen:</p>
<p>class parser_base{<br />
public:<br />
parser_base(std::istream &amp;is);<br />
void run();</p>
<p>protected:<br />
virtual void first() = 0;<br />
int get_token();<br />
unsigned int get_row();<br />
unsigned int get_col();<br />
void next_token();<br />
bool check_token(int token);<br />
void expect_token(int token);<br />
bool check_tokens(const std::vector&lt;int&gt; &amp;tokens);<br />
void expect_tokens(const std::vector&lt;int&gt; &amp;tokens);<br />
void expect_serie(const std::vector&lt;int&gt; &amp;tokens);<br />
bool check_range(int first, int last);<br />
void expect_range(int first, int last);<br />
void error();<br />
private:<br />
std::istream &amp;is;<br />
int token;<br />
unsigned int row, col;<br />
};</p>
<p>class fifth_interpreter : public parser_base{<br />
public:<br />
fifth_interpreter(std::istream &amp;is);</p>
<p>private:<br />
void add_numbers(void);<br />
void substract_numbers(void);<br />
void multiply_numbers(void);<br />
void divide_numbers(void);<br />
void print_number(void);</p>
<p>bool is_digit();<br />
int digit();<br />
bool is_whitespace();<br />
void whitespace();<br />
bool is_word_end();<br />
void word_end();<br />
bool is_number();<br />
void number();<br />
bool is_plus();<br />
void plus();<br />
bool is_minus();<br />
void minus();<br />
bool is_multiply();<br />
void multiply();<br />
bool is_divide();<br />
void divide();<br />
bool is_print();<br />
void print();<br />
bool is_word();<br />
void word();<br />
void first();</p>
<p>fifth::stack stack;<br />
};</p>
<p>[/code]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2108177</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2108177</guid><dc:creator><![CDATA[Martin Kalbfuß]]></dc:creator><pubDate>Fri, 19 Aug 2011 16:17:26 GMT</pubDate></item><item><title><![CDATA[Reply to ios_base::failure Ausnahme nach deaktivierung der Ausnahmen für den Stream on Fri, 19 Aug 2011 16:19:15 GMT]]></title><description><![CDATA[<p>Oh. Entschuldigung wegen der schlechten Formatierung. Da ist was mit meinen code tags shiefgelaufen. Hoffe, man kann es trotzdem erkennen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2108178</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2108178</guid><dc:creator><![CDATA[Martin Kalbfuß]]></dc:creator><pubDate>Fri, 19 Aug 2011 16:19:15 GMT</pubDate></item><item><title><![CDATA[Reply to ios_base::failure Ausnahme nach deaktivierung der Ausnahmen für den Stream on Fri, 19 Aug 2011 16:26:05 GMT]]></title><description><![CDATA[<p>Es ist für einen Helfer eher uninteressant, wie deine 100 Memberfunktionen alle heißen. Versuch doch mal nach und nach, <strong>alles</strong> unnötige aus deinem Code rauszuwerfen, bis nur noch ein Programm von 50, eventuell 100 Zeilen übrig ist, welches von den Lesern so ohne jegliche Änderungen oder Ergänzungen compiliert werden kann und an dem man den Fehler trotzdem noch sehen kann.</p>
<p>Wenn du während des Erstellens dieses Minimalsbeispiels auf einmal den Fehler nicht mehr bekommst, dann hast du höchstwahrscheinlich die Fehlerstelle rausgenommen und solltest dir mal genauer ansehen, was du zuletzt entfernt hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2108182</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2108182</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 19 Aug 2011 16:26:05 GMT</pubDate></item><item><title><![CDATA[Reply to ios_base::failure Ausnahme nach deaktivierung der Ausnahmen für den Stream on Fri, 19 Aug 2011 16:55:50 GMT]]></title><description><![CDATA[<p>Hier noch einmal ne Zusammenfassung: Ich greife jetzt direkt auf next_token zu.<br />
die function access_to_private_method is notwendig, da next_token private ist.</p>
<pre><code>fifth_interpreter::fifth_interpreter(std::istream &amp;is)
	: parser_base(is),
	  stack(64)
{}

parser_base::parser_base(std::istream &amp;is)
	: is(is),
	  row(0),
	  col(0)
{}

void parser_base::next_token(){
	token = is.get();
	check_token('\n') ? row++, col = 0 : col++;
}

void access_to_private_method(fifth_interpreter &amp;interpreter){
	interpreter.next_token();
}

int main(int argc, char **argv){
	if(1 &lt; argc &amp;&amp; argc &lt; 3){
		std::ifstream ifs;
		ifs.exceptions(std::ifstream::failbit | std::ifstream::badbit);

		try{
			ifs.open(argv[1]);
		}catch(std::ifstream::failure &amp;e){
			std::cerr &lt;&lt; &quot;Couldn't open source file &quot; &lt;&lt; argv[1] &lt;&lt; std::endl;
			exit(EXIT_FAILURE);
		}

		fifth_interpreter interpreter(ifs);

		try{
			std::istream::iostate iostate = ifs.exceptions();
			ifs.exceptions(std::istream::goodbit);
			access_to_private_method(interpreter);
			ifs.exceptions(iostate);

		}catch(std::exception &amp;e){
			e.what();
			std::cerr &lt;&lt; &quot;Parsing error&quot; &lt;&lt; std::endl;
		}

		ifs.close();

	}else
		std::cerr &lt;&lt; &quot;Wrong number of arguments&quot; &lt;&lt; std::endl;

	return EXIT_SUCCESS;
}
</code></pre>
<p>Die eingelesene Quelldatei ist jetzt vollständig leer. Er trifft also beim Aufruf von next token sofort auf das ende des streams. Ich gehe davon aus, dass is.get() EOF zurück gibt. Oder liege ich damit falsch? Es wird jedoch sofort eine Ausmahme ohne Fehlermeldung in what() geworfen.</p>
<p>Eigentlich ist es ja nicht notwendig die Ausnahmen vorher zu aktivieren und dann wieder zu deaktivieren. Ich will jedoch erreichen, dass mein Interpreter auch mit aktivieren Ausnahmen funktioniert.</p>
<p>Hoffe das ist jetzt besser.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2108203</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2108203</guid><dc:creator><![CDATA[Martin Kalbfuß]]></dc:creator><pubDate>Fri, 19 Aug 2011 16:55:50 GMT</pubDate></item><item><title><![CDATA[Reply to ios_base::failure Ausnahme nach deaktivierung der Ausnahmen für den Stream on Fri, 19 Aug 2011 17:14:17 GMT]]></title><description><![CDATA[<p>Das würde ich zwar nicht unter &quot;compilierbares Beispiel&quot; laufen lassen, aber mir ist trotzdem klar was passiert:<br />
Wenn du mit <code>ifs.exceptions(iostate);</code> die Ausnahmebehandlung wieder aktivierst, dann ist der Stream noch immer in einem Fehlerzustand und schmeißt daher prompt etwas.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2108209</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2108209</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 19 Aug 2011 17:14:17 GMT</pubDate></item><item><title><![CDATA[Reply to ios_base::failure Ausnahme nach deaktivierung der Ausnahmen für den Stream on Fri, 19 Aug 2011 17:16:42 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2108211</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2108211</guid><dc:creator><![CDATA[Martin Kalbfuß]]></dc:creator><pubDate>Fri, 19 Aug 2011 17:16:42 GMT</pubDate></item><item><title><![CDATA[Reply to ios_base::failure Ausnahme nach deaktivierung der Ausnahmen für den Stream on Fri, 19 Aug 2011 17:28:33 GMT]]></title><description><![CDATA[<p>Bleibt eigenlich nur noch die Fragbe offen, wieso er das lesen von EOF als Ausnahme behandelt.<br />
Ich habe doch std::ifstream::eofbit gar nicht gesetzt. Was kann man dagegen tun? EOF soll wie ein ganz normales Zeichen behandelt werden. Es ist ein zulässiges Zeichen im Quellcode und zeigt das Ende eines Tokens an, genau wie ' ', '\n' und '\t'.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2108219</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2108219</guid><dc:creator><![CDATA[Martinn Kalbfuß]]></dc:creator><pubDate>Fri, 19 Aug 2011 17:28:33 GMT</pubDate></item><item><title><![CDATA[Reply to ios_base::failure Ausnahme nach deaktivierung der Ausnahmen für den Stream on Fri, 19 Aug 2011 17:40:42 GMT]]></title><description><![CDATA[<p>Martinn Kalbfuß schrieb:</p>
<blockquote>
<p>EOF soll wie ein ganz normales Zeichen behandelt werden. Es ist ein zulässiges Zeichen im Quellcode und zeigt das Ende eines Tokens an, genau wie ' ', '\n' und '\t'.</p>
</blockquote>
<p>Technisch gesehen ist das Dateiende <em>kein</em> normales Zeichen, sondern ein Zustand des Streams - an der Stelle ist jeder weitere Leseversuch sinnlos.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2108227</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2108227</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 19 Aug 2011 17:40:42 GMT</pubDate></item></channel></rss>