// Test von exceptions in gemischten C/D Projekten // test of exceptions in mixed C/D projects extern (C) { int printf(in char*, ...); void* malloc(size_t); void free(void*); } class DCException : Exception { this(string msg) { super(msg); } } class Stream { public: new(uint size) { void* p = malloc(size); return p; } delete(void* p) { free(p); } void print(int fromc) { printf("Data from clib: %d\n", fromc); } } // implementiert in cexept.c // implemented in cexept.c extern (C) { void doCstuff(int param); void setReader(void* r, void (*fn)(int rparam)); void* getReader(); void doCRead(); } // handler called from doCStuff extern (C) void dhandler(int param) { throw new DCException("Something went wrong"); } void inventCstuff(int param) { try { doCstuff(param); printf("C stuff done without problems.\n"); } catch (Object o) { printf("Exception occured: %.*s\n", o.toString); printf("Type of exception: %.*s\n", o.classinfo.name); } } // reader callback, called from doCRead extern (C) void readCB(int rparam) { Stream s = cast(Stream)getReader(); if (s) s.print(rparam); } void main() { int param = 100; printf("param is %d\n", param); inventCstuff(param); param = 13; printf("param is now %d\nShould crash!\n", param); inventCstuff(param); Stream s = new Stream; setReader(cast(void*)s, &readCB); for (int i = 0; i < 5; i++) doCRead(); delete s; }