diff --git a/src/main/java/cz/it4i/qcmp/benchmark/SQBenchmark.java b/src/main/java/cz/it4i/qcmp/benchmark/SQBenchmark.java
index 0ced9b7f816b1d86bf01c189bbb2b0a9e3e8f6e8..fe2581bed6e97bd0258895dde39a91796b26732f 100644
--- a/src/main/java/cz/it4i/qcmp/benchmark/SQBenchmark.java
+++ b/src/main/java/cz/it4i/qcmp/benchmark/SQBenchmark.java
@@ -45,10 +45,12 @@ public class SQBenchmark extends BenchmarkBase {
         if (options.getCodebookType() == CompressionOptions.CodebookType.Global) {
             System.out.println("Loading codebook from cache");
             final QuantizationCacheManager cacheManager = new QuantizationCacheManager(cacheFolder);
-            final SQCodebook codebook = cacheManager.loadSQCodebook(inputFile, codebookSize);
-
-            if (codebook == null) {
+            final SQCodebook codebook;
+            try {
+                codebook = cacheManager.loadSQCodebook(inputFile, codebookSize);
+            } catch (final IOException e) {
                 System.err.println("Failed to read quantization values from cache file.");
+                e.printStackTrace();
                 return;
             }
 
diff --git a/src/main/java/cz/it4i/qcmp/cache/QuantizationCacheManager.java b/src/main/java/cz/it4i/qcmp/cache/QuantizationCacheManager.java
index b01c051fd459c83137ddc7ab69557bda5bdac91b..f780fe77d6dfdb85455bd36fb9aec69ad8ba4d4f 100644
--- a/src/main/java/cz/it4i/qcmp/cache/QuantizationCacheManager.java
+++ b/src/main/java/cz/it4i/qcmp/cache/QuantizationCacheManager.java
@@ -121,7 +121,7 @@ public class QuantizationCacheManager {
      * @param codebookSize Codebook size.
      * @return SQ cache file.
      */
-    public SqQvcFile loadSQCacheFile(final String imageFile, final int codebookSize) {
+    public SqQvcFile loadSQCacheFile(final String imageFile, final int codebookSize) throws IOException {
         final File fileInfo = getCacheFilePathForSQ(imageFile, codebookSize);
         return (SqQvcFile) QvcFileReader.readCacheFile(fileInfo.getAbsolutePath());
     }
@@ -134,9 +134,7 @@ public class QuantizationCacheManager {
      * @param vDim         Quantization vector dimension.
      * @return VQ cache file.
      */
-    public VqQvcFile loadVQCacheFile(final String trainFile,
-                                     final int codebookSize,
-                                     final V3i vDim) {
+    public VqQvcFile loadVQCacheFile(final String trainFile, final int codebookSize, final V3i vDim) throws IOException {
         final File fileInfo = getCacheFilePathForVQ(trainFile, codebookSize, vDim);
         return (VqQvcFile) QvcFileReader.readCacheFile(fileInfo.getAbsolutePath());
     }
@@ -148,12 +146,8 @@ public class QuantizationCacheManager {
      * @param codebookSize Codebook size.
      * @return SQ codebook or null.
      */
-    public SQCodebook loadSQCodebook(final String trainFile, final int codebookSize) {
-        final SqQvcFile cacheFile = loadSQCacheFile(trainFile, codebookSize);
-        if (cacheFile != null)
-            return cacheFile.getCodebook();
-        else
-            return null;
+    public SQCodebook loadSQCodebook(final String trainFile, final int codebookSize) throws IOException {
+        return loadSQCacheFile(trainFile, codebookSize).getCodebook();
     }
 
     /**
@@ -164,15 +158,8 @@ public class QuantizationCacheManager {
      * @param vDim         Quantization vector dimension.
      * @return VQ codebook.
      */
-    public VQCodebook loadVQCodebook(final String trainFile,
-                                     final int codebookSize,
-                                     final V3i vDim) {
-        final VqQvcFile cacheFile = loadVQCacheFile(trainFile, codebookSize, vDim);
-        if (cacheFile != null)
-            return cacheFile.getCodebook();
-        else
-            return null;
-
+    public VQCodebook loadVQCodebook(final String trainFile, final int codebookSize, final V3i vDim) throws IOException {
+        return loadVQCacheFile(trainFile, codebookSize, vDim).getCodebook();
     }
 
     /**
@@ -189,7 +176,12 @@ public class QuantizationCacheManager {
 
             for (int bpci = 2; bpci < 9; bpci++) { // 2 to 8
                 compressionParams.setBitsPerCodebookIndex(bpci);
-                final IQvcFile bpciCacheFile = loadCacheFile(compressionParams);
+                final IQvcFile bpciCacheFile;
+                try {
+                    bpciCacheFile = loadCacheFile(compressionParams);
+                } catch (final IOException e) {
+                    continue;
+                }
                 if (bpciCacheFile != null) {
                     availableCacheFiles.add(bpciCacheFile);
                 }
@@ -207,7 +199,7 @@ public class QuantizationCacheManager {
      * @param compressionParams Parameters used to find cache file.
      * @return Quantization cache file or null if requested file doesn't exist.
      */
-    public IQvcFile loadCacheFile(final CompressionOptions compressionParams) {
+    public IQvcFile loadCacheFile(final CompressionOptions compressionParams) throws IOException {
         final String path;
         final int codebookSize = (int) Math.pow(2, compressionParams.getBitsPerCodebookIndex());
         switch (compressionParams.getQuantizationType()) {
@@ -237,11 +229,15 @@ public class QuantizationCacheManager {
      * @param path Path to cache file.
      */
     public static void inspectCacheFile(final String path, final boolean verbose) {
-        final IQvcFile qvcFile = QvcFileReader.readCacheFile(path);
-        if (qvcFile == null) {
+        final IQvcFile qvcFile;
+        try {
+            qvcFile = QvcFileReader.readCacheFile(path);
+        } catch (final IOException e) {
             System.err.println("Provided path is not of valid QVC file.");
+            e.printStackTrace();
             return;
         }
+
         if (!qvcFile.getHeader().validateHeader()) {
             System.err.println("Provided file is corrupted. Header is not valid.");
             return;
diff --git a/src/main/java/cz/it4i/qcmp/cache/QvcFileReader.java b/src/main/java/cz/it4i/qcmp/cache/QvcFileReader.java
index 0c349379239ec5d41cb685aeeefbd0a3f418647b..5883a7d6b60480e4d44faa4865593947cfa18130 100644
--- a/src/main/java/cz/it4i/qcmp/cache/QvcFileReader.java
+++ b/src/main/java/cz/it4i/qcmp/cache/QvcFileReader.java
@@ -17,13 +17,9 @@ public class QvcFileReader {
      * @param path File path.
      * @return Cache file or null if reading fails.
      */
-    public static IQvcFile readCacheFile(final String path) {
+    public static IQvcFile readCacheFile(final String path) throws IOException {
         try (final FileInputStream fis = new FileInputStream(path)) {
             return readCacheFileImpl(fis);
-        } catch (final IOException e) {
-            System.err.println(e.getMessage());
-            e.printStackTrace();
-            return null;
         }
     }
 
diff --git a/src/main/java/cz/it4i/qcmp/compression/SQImageCompressor.java b/src/main/java/cz/it4i/qcmp/compression/SQImageCompressor.java
index 64391e258014c20101a0df9b9f7fc8c4117c02ff..caab1717c9ccef2dd57aba673d980214e885656a 100644
--- a/src/main/java/cz/it4i/qcmp/compression/SQImageCompressor.java
+++ b/src/main/java/cz/it4i/qcmp/compression/SQImageCompressor.java
@@ -90,9 +90,11 @@ public class SQImageCompressor extends CompressorDecompressorBase implements IIm
             trainAndSaveCodebook();
         }
 
-        final SQCodebook codebook = cacheManager.loadSQCodebook(options.getInputDataInfo().getCacheFileName(), getCodebookSize());
-        if (codebook == null) {
-            throw new ImageCompressionException("Failed to read quantization values from cache file.");
+        final SQCodebook codebook;
+        try {
+            codebook = cacheManager.loadSQCodebook(options.getInputDataInfo().getCacheFileName(), getCodebookSize());
+        } catch (final IOException e) {
+            throw new ImageCompressionException("Failed to read quantization values from cache file.", e);
         }
         return new ScalarQuantizer(codebook);
     }
diff --git a/src/main/java/cz/it4i/qcmp/compression/VQImageCompressor.java b/src/main/java/cz/it4i/qcmp/compression/VQImageCompressor.java
index d1b6ed0a2aa45de60dad2aec4fee1e3b23a61a3a..e05cbbeffc14a69930dddc0b2eba728a23c30274 100644
--- a/src/main/java/cz/it4i/qcmp/compression/VQImageCompressor.java
+++ b/src/main/java/cz/it4i/qcmp/compression/VQImageCompressor.java
@@ -107,12 +107,13 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm
             trainAndSaveCodebook();
         }
 
-        final VQCodebook codebook = cacheManager.loadVQCodebook(options.getInputDataInfo().getCacheFileName(),
-                                                                getCodebookSize(),
-                                                                options.getQuantizationVector());
-
-        if (codebook == null) {
-            throw new ImageCompressionException("Failed to read quantization vectors from cache.");
+        final VQCodebook codebook;
+        try {
+            codebook = cacheManager.loadVQCodebook(options.getInputDataInfo().getCacheFileName(),
+                                                   getCodebookSize(),
+                                                   options.getQuantizationVector());
+        } catch (final IOException e) {
+            throw new ImageCompressionException("Failed to read quantization vectors from cache.", e);
         }
         return new VectorQuantizer(codebook);
     }