From 0772d9a4a3320fa44927cb4565af0a758bdb8cb2 Mon Sep 17 00:00:00 2001 From: Hans Gaiser Date: Fri, 9 Jun 2017 23:20:11 +0200 Subject: [PATCH 1/2] Add try/catch around python function calls. --- src/caffe/net.cpp | 50 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index 353c2f95b9e..a7d63307058 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -5,6 +5,11 @@ #include #include +#ifdef WITH_PYTHON_LAYER +#include +namespace bp = boost::python; +#endif + #include "hdf5.h" #include "caffe/common.hpp" @@ -118,7 +123,16 @@ void Net::Init(const NetParameter& in_param) { } } // After this layer is connected, set it up. - layers_[layer_id]->SetUp(bottom_vecs_[layer_id], top_vecs_[layer_id]); +#ifdef WITH_PYTHON_LAYER + try { +#endif + layers_[layer_id]->SetUp(bottom_vecs_[layer_id], top_vecs_[layer_id]); +#ifdef WITH_PYTHON_LAYER + } catch (bp::error_already_set) { + PyErr_Print(); + throw; + } +#endif LOG_IF(INFO, Caffe::root_solver()) << "Setting up " << layer_names_[layer_id]; for (int top_id = 0; top_id < top_vecs_[layer_id].size(); ++top_id) { @@ -521,7 +535,17 @@ Dtype Net::ForwardFromTo(int start, int end) { for (int c = 0; c < before_forward_.size(); ++c) { before_forward_[c]->run(i); } - Dtype layer_loss = layers_[i]->Forward(bottom_vecs_[i], top_vecs_[i]); + Dtype layer_loss; +#ifdef WITH_PYTHON_LAYER + try { +#endif + layer_loss = layers_[i]->Forward(bottom_vecs_[i], top_vecs_[i]); +#ifdef WITH_PYTHON_LAYER + } catch (bp::error_already_set) { + PyErr_Print(); + throw; + } +#endif loss += layer_loss; if (debug_info_) { ForwardDebugInfo(i); } for (int c = 0; c < after_forward_.size(); ++c) { @@ -572,8 +596,17 @@ void Net::BackwardFromTo(int start, int end) { before_backward_[c]->run(i); } if (layer_need_backward_[i]) { - layers_[i]->Backward( - top_vecs_[i], bottom_need_backward_[i], bottom_vecs_[i]); +#ifdef WITH_PYTHON_LAYER + try { +#endif + layers_[i]->Backward( + top_vecs_[i], bottom_need_backward_[i], bottom_vecs_[i]); +#ifdef WITH_PYTHON_LAYER + } catch (bp::error_already_set) { + PyErr_Print(); + throw; + } +#endif if (debug_info_) { BackwardDebugInfo(i); } } for (int c = 0; c < after_backward_.size(); ++c) { @@ -725,7 +758,16 @@ void Net::Backward() { template void Net::Reshape() { for (int i = 0; i < layers_.size(); ++i) { +#ifdef WITH_PYTHON_LAYER + try { +#endif layers_[i]->Reshape(bottom_vecs_[i], top_vecs_[i]); +#ifdef WITH_PYTHON_LAYER + } catch (bp::error_already_set) { + PyErr_Print(); + throw; + } +#endif } } From 74073c921093f626b73c8c740b147519c6b405c5 Mon Sep 17 00:00:00 2001 From: Hans Gaiser Date: Thu, 29 Jun 2017 10:12:40 +0200 Subject: [PATCH 2/2] Restore python error after printing. --- src/caffe/net.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index a7d63307058..ea8d49a43fd 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -8,6 +8,14 @@ #ifdef WITH_PYTHON_LAYER #include namespace bp = boost::python; + +void PrintPyError() { + PyObject * ptype, * pvalue, * ptraceback; + PyErr_Fetch(&ptype, &pvalue, &ptraceback); + PyErr_Print(); + PyErr_Restore(ptype, pvalue, ptraceback); +} + #endif #include "hdf5.h" @@ -128,8 +136,8 @@ void Net::Init(const NetParameter& in_param) { #endif layers_[layer_id]->SetUp(bottom_vecs_[layer_id], top_vecs_[layer_id]); #ifdef WITH_PYTHON_LAYER - } catch (bp::error_already_set) { - PyErr_Print(); + } catch (bp::error_already_set const &) { + PrintPyError(); throw; } #endif @@ -542,7 +550,7 @@ Dtype Net::ForwardFromTo(int start, int end) { layer_loss = layers_[i]->Forward(bottom_vecs_[i], top_vecs_[i]); #ifdef WITH_PYTHON_LAYER } catch (bp::error_already_set) { - PyErr_Print(); + PrintPyError(); throw; } #endif @@ -603,7 +611,7 @@ void Net::BackwardFromTo(int start, int end) { top_vecs_[i], bottom_need_backward_[i], bottom_vecs_[i]); #ifdef WITH_PYTHON_LAYER } catch (bp::error_already_set) { - PyErr_Print(); + PrintPyError(); throw; } #endif