<?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[Exception in dynamischer Bibliothek werfen]]></title><description><![CDATA[<p>Ich möchte eine Exception in einer Funktion werfen, die in einer dynamischen Bibliothek definiert ist. Die Exception jedoch ist im Hauptprogramm definiert, das das Exception-Objekt dann auch fangen soll. Allerdings fängt er es anscheinend nur, wenn ich direkt im Hauptprogramm werfe; wenn ich es in der Bibliothek tue, fällt die Exception bis ganz nach oben durch. Warum macht das einen Unterschied, kann das das nicht machen?</p>
<p>Exception.h:</p>
<pre><code class="language-cpp">#include &lt;string&gt;

// Simple Exception-Klasse
class Exception {
	std::string msg;
  public:
	Exception(std::string);
	std::string getMessage();
};
</code></pre>
<p>Exception.cpp:</p>
<pre><code class="language-cpp">#include &lt;string&gt;

using std::string;

#include &quot;Exception.h&quot;

Exception::Exception(string m) : msg(m) {}

string Exception::getMessage() {
	return msg;
}
</code></pre>
<p>library.cpp:</p>
<pre><code class="language-cpp">#include &lt;string&gt;

using std::string;

#include &quot;Exception.h&quot;

// Was ich bekomme: Callback-Constructor-Typ
typedef Exception* (*ctor_t)(string);

extern &quot;C&quot; {
	void init(ctor_t ctor) {
		throw ctor(&quot;foo&quot;);   // wirf eine neue Exception
	}
}
</code></pre>
<p>program.cpp:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;dlfcn.h&gt;

using std::cout;
using std::endl;
using std::string;

#include &quot;Exception.h&quot;

// Ich muss das Objekt ja im Hauptprogramm erstellen...
Exception* ctor(string msg) {
	return new Exception(msg);
}

// Was ich gebe: Callback-Constructor-Typ
typedef Exception* (*ctor_t)(string);
// Was ich aus der Bibliothek lade
typedef void (*init_t)(ctor_t);

int main() {
	// OK, Bibliothek laden, das klappt ja alles
	void* lib = dlopen(&quot;./library.so&quot;, RTLD_LAZY);
	init_t init = (init_t)dlsym(lib, &quot;init&quot;);
	// Jetzt wird's witzig, die Funktion aus der Bibliothek aufrufen:
	try {
		init(ctor);
	}
	catch(Exception* e) {
		// Aber dummerweise komme ich nie hier an
		cout &lt;&lt; &quot;Exception: &quot; &lt;&lt; e-&gt;getMessage() &lt;&lt; endl;
	}
	return 0;
}
</code></pre>
<p>Funktionert aber nicht:</p>
<pre><code>$ g++ -fPIC -c library.cpp
$ g++ -shared -Wl,-soname,library.so -olibrary.so library.o
$ g++ Exception.cpp program.cpp -ldl
$ ./a.out
terminate called after throwing an instance of 'Exception*'
zsh: abort      ./a.out
</code></pre>
<p>PS: Das Problem scheint tatsächlich zu sein, dass er das, was da fliegt, nicht als <em>Exception</em>* erkennt. Wenn ich das Ding vor dem Werfen nach <em>int</em> caste und nach dem Fangen wieder zurück, funktionert es einwandfrei...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/159393/exception-in-dynamischer-bibliothek-werfen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 10 Sep 2026 14:51:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/159393.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 14 Sep 2006 14:41:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Exception in dynamischer Bibliothek werfen on Thu, 14 Sep 2006 14:50:34 GMT]]></title><description><![CDATA[<p>Ich möchte eine Exception in einer Funktion werfen, die in einer dynamischen Bibliothek definiert ist. Die Exception jedoch ist im Hauptprogramm definiert, das das Exception-Objekt dann auch fangen soll. Allerdings fängt er es anscheinend nur, wenn ich direkt im Hauptprogramm werfe; wenn ich es in der Bibliothek tue, fällt die Exception bis ganz nach oben durch. Warum macht das einen Unterschied, kann das das nicht machen?</p>
<p>Exception.h:</p>
<pre><code class="language-cpp">#include &lt;string&gt;

// Simple Exception-Klasse
class Exception {
	std::string msg;
  public:
	Exception(std::string);
	std::string getMessage();
};
</code></pre>
<p>Exception.cpp:</p>
<pre><code class="language-cpp">#include &lt;string&gt;

using std::string;

#include &quot;Exception.h&quot;

Exception::Exception(string m) : msg(m) {}

string Exception::getMessage() {
	return msg;
}
</code></pre>
<p>library.cpp:</p>
<pre><code class="language-cpp">#include &lt;string&gt;

using std::string;

#include &quot;Exception.h&quot;

// Was ich bekomme: Callback-Constructor-Typ
typedef Exception* (*ctor_t)(string);

extern &quot;C&quot; {
	void init(ctor_t ctor) {
		throw ctor(&quot;foo&quot;);   // wirf eine neue Exception
	}
}
</code></pre>
<p>program.cpp:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;dlfcn.h&gt;

using std::cout;
using std::endl;
using std::string;

#include &quot;Exception.h&quot;

// Ich muss das Objekt ja im Hauptprogramm erstellen...
Exception* ctor(string msg) {
	return new Exception(msg);
}

// Was ich gebe: Callback-Constructor-Typ
typedef Exception* (*ctor_t)(string);
// Was ich aus der Bibliothek lade
typedef void (*init_t)(ctor_t);

int main() {
	// OK, Bibliothek laden, das klappt ja alles
	void* lib = dlopen(&quot;./library.so&quot;, RTLD_LAZY);
	init_t init = (init_t)dlsym(lib, &quot;init&quot;);
	// Jetzt wird's witzig, die Funktion aus der Bibliothek aufrufen:
	try {
		init(ctor);
	}
	catch(Exception* e) {
		// Aber dummerweise komme ich nie hier an
		cout &lt;&lt; &quot;Exception: &quot; &lt;&lt; e-&gt;getMessage() &lt;&lt; endl;
	}
	return 0;
}
</code></pre>
<p>Funktionert aber nicht:</p>
<pre><code>$ g++ -fPIC -c library.cpp
$ g++ -shared -Wl,-soname,library.so -olibrary.so library.o
$ g++ Exception.cpp program.cpp -ldl
$ ./a.out
terminate called after throwing an instance of 'Exception*'
zsh: abort      ./a.out
</code></pre>
<p>PS: Das Problem scheint tatsächlich zu sein, dass er das, was da fliegt, nicht als <em>Exception</em>* erkennt. Wenn ich das Ding vor dem Werfen nach <em>int</em> caste und nach dem Fangen wieder zurück, funktionert es einwandfrei...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1137402</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1137402</guid><dc:creator><![CDATA[DollyDuplex]]></dc:creator><pubDate>Thu, 14 Sep 2006 14:50:34 GMT</pubDate></item><item><title><![CDATA[Reply to Exception in dynamischer Bibliothek werfen on Sat, 16 Sep 2006 10:59:53 GMT]]></title><description><![CDATA[<p>Hallo,<br />
der C++ Standard schreibt nicht vor, ob das Werfen/Fangen von Exceptions über Bibliotheksgrenzen hinasus funktioniert, sowas ist im höchsten maße Compiler-abhängig. Im Allgemeinen funktioniert das nicht, da sich der Exception-Mechanismus von Compiler zu Compiler und von Runtime-Lib zu Runtime-Lib unterscheidet. Falls du wirklich diesen Weg beschreiten willst, wirst du ein passende Antwort auf deine Frage sich in der gcc-Doku finden.</p>
<p>Gängige Praxis ist es aber, Exceptions nur lokal zu verwenden, sie also an Modulgrenzen zu fangen. Dort können sie z.B. dann auf Fehlercodes abgebildet werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1138402</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1138402</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Sat, 16 Sep 2006 10:59:53 GMT</pubDate></item><item><title><![CDATA[Reply to Exception in dynamischer Bibliothek werfen on Sat, 16 Sep 2006 11:14:14 GMT]]></title><description><![CDATA[<p>Hilft das: <a href="http://www.gatago.com/gnu/gcc/15176800.html" rel="nofollow">http://www.gatago.com/gnu/gcc/15176800.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1138411</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1138411</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Sat, 16 Sep 2006 11:14:14 GMT</pubDate></item></channel></rss>