Any libunwind experts n da house?
IgorStepanov via Digitalmars-d
digitalmars-d at puremagic.com
Fri Sep 26 17:21:46 PDT 2014
On Thursday, 25 September 2014 at 13:58:23 UTC, Andrei
Alexandrescu wrote:
> On 9/25/14, 4:55 AM, Kagamin wrote:
>> On Wednesday, 24 September 2014 at 15:07:05 UTC, Andrei
>> Alexandrescu wrote:
>>> I wonder how difficult would be to create a wrapper class
>>> CppException
>>> for everything derived from C++ std::exception.
>>
>> Why not catch std::exception directly? Then you could generate
>> code,
>> just like C++ compiler does it.
>
> That would be a language change - right now D can only catch
> Exception objects.
>
> Andrei
I've implemented an experemental "framework" to catching C++
exceptions from D.
https://github.com/IgorStepanov/D-CPP-Exception-Handle
It works with G++, and depends on "unwind-cxx.h" header, which
has been stealed from "libstdc++/libsupc++/". libsupc++ is a part
of libstdc++ and this file can be found in libstdc++ sources.
However, libstdc++ developers doesn't publish this header and it
cannot be found in /usr/include/
This "framework" allows to call external C++ function and call
exception, if good handler is passed. Also it can process
polymorphic exceptions: in attached example I throws
std::logic_exception and catches std::exception:
//C++
#include <stdexcept>
//test function
void throwEx(void *)
{
throw std::logic_error("Catch me, if you can");
}
//D
extern(C++) void throwEx(void *);
void main()
{
/*
code like ...
try
{
throwEx(null);
}
catch(std.exception val)
{
printf("exception: '%s'\n", val.what());
}
may be rewritten as
*/
Try!(throwEx)(
(CPPException!int ex)
{
printf("exception: '%d'\n", *ex.data);
return 0;
},
(CPPException!(stdexceptions.std.exception) ex)
{
printf("exception: '%s'\n", ex.data.what());
return 0;
}
);
}
//prints: exception: 'Catch me, if you can'
However, DMD can't pass ะก++ exceptions through D function
(including extern(C++)). Thus, we cant pass delegate to Try
function instead of throwEx, but this trouble can be resolved, I
think.
More information about the Digitalmars-d
mailing list