diff --git a/src/wrap_constants.cpp b/src/wrap_constants.cpp
index 5b195687ce415c635df6921f12e21c6c5da6ab2b..495850d53aacac43cd8836208be83e17fe8af9af 100644
--- a/src/wrap_constants.cpp
+++ b/src/wrap_constants.cpp
@@ -6,30 +6,6 @@ using namespace pyopencl;
 
 namespace
 {
-#if 0
-  py::handle
-    CLError,
-    CLMemoryError,
-    CLLogicError,
-    CLRuntimeError;
-
-
-
-
-  void translate_cl_error(const error &err)
-  {
-    if (err.code() == CL_MEM_OBJECT_ALLOCATION_FAILURE)
-      PyErr_SetObject(CLMemoryError.get(), py::object(err).ptr());
-    else if (err.code() <= CL_INVALID_VALUE)
-      PyErr_SetObject(CLLogicError.get(), py::object(err).ptr());
-    else if (err.code() > CL_INVALID_VALUE && err.code() < CL_SUCCESS)
-      PyErr_SetObject(CLRuntimeError.get(), py::object(err).ptr());
-    else
-      PyErr_SetObject(CLError.get(), py::object(err).ptr());
-  }
-#endif
-
-
   // {{{ 'fake' constant scopes
   class status_code { };
   class platform_info { };
@@ -86,22 +62,38 @@ namespace
 
 void pyopencl_expose_constants(py::module &m)
 {
-#if 0
   // {{{ exceptions
+  {
 #define DECLARE_EXC(NAME, BASE) \
-  CL##NAME = py::handle<>(PyErr_NewException("pyopencl." #NAME, BASE, NULL)); \
-  py::scope().attr(#NAME) = CL##NAME;
+  static py::exception<pyopencl::error> CL##NAME(m, #NAME, BASE);
 
-  {
     DECLARE_EXC(Error, NULL);
-    DECLARE_EXC(MemoryError, CLError.get());
-    DECLARE_EXC(LogicError, CLError.get());
-    DECLARE_EXC(RuntimeError, CLError.get());
-
-    py::register_exception_translator<error>(translate_cl_error);
+    DECLARE_EXC(MemoryError, CLError.ptr());
+    DECLARE_EXC(LogicError, CLError.ptr());
+    DECLARE_EXC(RuntimeError, CLError.ptr());
+
+    py::register_exception_translator(
+        [](std::exception_ptr p)
+        {
+          try
+          {
+            if (p) std::rethrow_exception(p);
+          }
+          catch (pyopencl::error &err)
+          {
+            py::object err_obj = py::cast(err);
+            if (err.code() == CL_MEM_OBJECT_ALLOCATION_FAILURE)
+              PyErr_SetObject(CLMemoryError.ptr(), err_obj.ptr());
+            else if (err.code() <= CL_INVALID_VALUE)
+              PyErr_SetObject(CLLogicError.ptr(), err_obj.ptr());
+            else if (err.code() > CL_INVALID_VALUE && err.code() < CL_SUCCESS)
+              PyErr_SetObject(CLRuntimeError.ptr(), err_obj.ptr());
+            else
+              PyErr_SetObject(CLError.ptr(), err_obj.ptr());
+          }
+        });
   }
   // }}}
-#endif
 
   // {{{ constants
 #define ADD_ATTR(PREFIX, NAME) \