Raise Python exceptions if CaffeNet input files don't exist
authorJonathan L Long <jonlong@cs.berkeley.edu>
Wed, 12 Mar 2014 00:10:14 +0000 (17:10 -0700)
committerJonathan L Long <jonlong@cs.berkeley.edu>
Tue, 18 Mar 2014 05:59:02 +0000 (22:59 -0700)
This is for convenience only; if the input files are moved or deleted at
the wrong time, pycaffe could still crash (as it did before). However,
in most cases this will make interactive use easier.

python/caffe/_caffe.cpp

index 581a78d..137cc28 100644 (file)
@@ -12,6 +12,7 @@
 // these need to be included after boost on OS X
 #include <string>  // NOLINT(build/include_order)
 #include <vector>  // NOLINT(build/include_order)
+#include <fstream>  // NOLINT
 
 #include "caffe/caffe.hpp"
 
@@ -122,6 +123,23 @@ class CaffeLayer {
 // A simple wrapper over CaffeNet that runs the forward process.
 struct CaffeNet {
   CaffeNet(string param_file, string pretrained_param_file) {
+    // for convenience, check that the input files can be opened, and raise
+    // an exception that boost will send to Python if not
+    // (this function could still crash if the input files are disturbed
+    //  before Net construction)
+    std::ifstream f(param_file.c_str());
+    if (!f.good()) {
+      f.close();
+      throw std::runtime_error("Could not open file " + param_file);
+    }
+    f.close();
+    f.open(pretrained_param_file.c_str());
+    if (!f.good()) {
+      f.close();
+      throw std::runtime_error("Could not open file " + pretrained_param_file);
+    }
+    f.close();
+
     net_.reset(new Net<float>(param_file));
     net_->CopyTrainedLayersFrom(pretrained_param_file);
   }