typo fix
[pykit.git] / PythonPublisher.cc
index f84b8da..f1699d4 100644 (file)
@@ -433,6 +433,16 @@ namespace {
         return pykit::Viewer::instance()->page()->history()->canGoForward();
     }
 
+    class ErrorCatcher
+    {
+    public:
+        explicit ErrorCatcher(std::string & out) : out_ (out) {}
+        void write(std::string const & msg)
+            { std::cerr << "append: " << msg; out_ += msg; }
+    private:
+        std::string & out_;
+    };
+
 }
 
 BOOST_PYTHON_MODULE(_pykit)
@@ -454,6 +464,10 @@ BOOST_PYTHON_MODULE(_pykit)
         .def("publish", py::pure_virtual(&pykit::Publisher::publish))
         ;
 
+    py::class_<ErrorCatcher>("ErrorCatcher", py::no_init)
+        .def("write", &ErrorCatcher::write)
+        ;
+
     py::def("openUrl", &QDesktopServices::openUrl);
 
     py::def("canGoBack", &canGoBack);
@@ -465,18 +479,28 @@ PYTHON_EXTERN_MODULE(_httpapi);
 prefix_ pykit::PythonPublisher::PythonPublisher()
     : impl_ (new Impl)
 {
+    std::string pyError;
     try {
         PYTHON_PREPARE_IMPORT(_pykit);
         PYTHON_PREPARE_IMPORT(_qt);
         PYTHON_PREPARE_IMPORT(_httpapi);
         Py_Initialize();
-        py::object initModule = py::import("init");
+
+        py::import("_pykit");
+        py::object sysModule (py::import("sys"));
+        py::object origStderr (sysModule.attr("stderr"));
+        ErrorCatcher catcher (pyError);
+        sysModule.attr("stderr") = catcher;
+
+        py::object initModule (py::import("init"));
         impl_->mainNamespace = py::extract<py::dict>(initModule.attr("__dict__"));
         impl_->pythonPublisher = py::extract<Publisher*>(impl_->mainNamespace["initialize"]());
+
+        sysModule.attr("stderr") = origStderr;
     }
     catch (boost::python::error_already_set & ex) {
         PyErr_Print();
-        throw;
+        throw PythonError(pyError);
     }
 }
 
@@ -495,6 +519,7 @@ prefix_ void pykit::PythonPublisher::publish(Request & request)
     }
     catch (py::error_already_set & ex) {
         PyErr_Print();
+        PyErr_Clear();
     }
 }