Sergey Gromov wrote:
What happens if an extern(Windows) function throws?
Very, very bad things.
Basically I want my export DLL interface functions to fail gracefully. What happens if I don't catch? Currently my typical export looks like this, and it looks a bit verbose:
Yup. It's pretty awful, and you need to remember to do it every time. I do something like: void doDllRegisterServer() { doStuff(); } extern(Windows) export HRESULT DllRegisterServer() { mixin(SafeInvoke("doDllRegisterServer()")); } where SafeInvoke creates a string mixin which adds all the catch wrappers. >
extern(Windows) export HRESULT DllRegisterServer() { try { doStuff(); } catch(Exception e) { myTrace("Shit happens. Reason: " ~ e.msg); return E_UNEXPECTED; } catch(Object obj) { myTrace("Shit happens. Reason: " ~ obj.toString()); return E_UNEXPECTED; } catch { myTrace("Shit happens. Reason: unknown"); return E_UNEXPECTED; } return S_OK; }