diff --git a/src/libslic3r/PrintExport.hpp b/src/libslic3r/PrintExport.hpp
index 8187d7bf0..5cfb55217 100644
--- a/src/libslic3r/PrintExport.hpp
+++ b/src/libslic3r/PrintExport.hpp
@@ -227,29 +227,35 @@ public:
     inline void save(const std::string& path) {
         try {
             LayerWriter<LyrFmt> writer(path);
+            if(!writer.is_ok()) return;
 
             std::string project = writer.get_name();
 
             writer.next_entry("config.ini");
+            if(!writer.is_ok()) return;
+
             writer << createIniContent(project);
 
-            for(unsigned i = 0; i < m_layers_rst.size(); i++) {
+            for(unsigned i = 0; i < m_layers_rst.size() && writer.is_ok(); i++)
+            {
                 if(m_layers_rst[i].second.rdbuf()->in_avail() > 0) {
                     char lyrnum[6];
                     std::sprintf(lyrnum, "%.5d", i);
                     auto zfilename = project + lyrnum + ".png";
                     writer.next_entry(zfilename);
+
+                    if(!writer.is_ok()) break;
+
                     writer << m_layers_rst[i].second.str();
                     // writer << m_layers_rst[i].second.rdbuf();
                     // we can keep the date for later calls of this method
                     //m_layers_rst[i].second.str("");
                 }
             }
-
-            writer.close();
         } catch(std::exception& e) {
             BOOST_LOG_TRIVIAL(error) << e.what();
-            return;
+            // Rethrow the exception
+            throw;
         }
     }
 
diff --git a/src/slic3r/GUI/BackgroundSlicingProcess.cpp b/src/slic3r/GUI/BackgroundSlicingProcess.cpp
index b9f146013..891e5f0dc 100644
--- a/src/slic3r/GUI/BackgroundSlicingProcess.cpp
+++ b/src/slic3r/GUI/BackgroundSlicingProcess.cpp
@@ -113,10 +113,17 @@ public:
         zipstream(zipfile),
         pngstream(zipstream)
     {
-        if(!zipfile.IsOk())
+        if(!is_ok())
             throw std::runtime_error("Cannot create zip file.");
     }
 
+    ~LayerWriter() {
+        // In case of an error (disk space full) zipstream destructor would
+        // crash.
+        pngstream.clear();
+        zipstream.CloseEntry();
+    }
+
     inline void next_entry(const std::string& fname) {
         zipstream.PutNextEntry(fname);
     }
@@ -129,6 +136,10 @@ public:
         pngstream << arg; return *this;
     }
 
+    bool is_ok() const {
+        return pngstream.good() && zipstream.IsOk() && zipfile.IsOk();
+    }
+
     inline void close() {
         zipstream.Close();
         zipfile.Close();