Index: src/sas/sascalc/dataloader/file_reader_base_class.py
===================================================================
--- src/sas/sascalc/dataloader/file_reader_base_class.py	(revision b09095a7f7ba6ae5e7ee28a9d240400222cbae19)
+++ src/sas/sascalc/dataloader/file_reader_base_class.py	(revision da8bb53be7e5e725c5c588a677fbc7eb7238e129)
@@ -10,5 +10,5 @@
 from abc import abstractmethod
 from loader_exceptions import NoKnownLoaderException, FileContentsException,\
-    DataReaderException
+    DataReaderException, DefaultReaderException
 from data_info import Data1D, Data2D, DataInfo, plottable_1D, plottable_2D,\
     combine_data_info_with_plottable
@@ -47,16 +47,15 @@
         if os.path.isfile(filepath):
             basename, extension = os.path.splitext(os.path.basename(filepath))
+            self.extension = extension.lower()
             # If the file type is not allowed, return nothing
-            if extension in self.ext or self.allow_all:
+            if self.extension in self.ext or self.allow_all:
                 # Try to load the file, but raise an error if unable to.
                 try:
-                    self.unit_converter()
+                    self.load_unit_converter()
                     self.f_open = open(filepath, 'rb')
                     self.get_file_contents()
                     self.sort_one_d_data()
-                except RuntimeError:
-                    # Reader specific errors
-                    # TODO: Give a specific error.
-                    pass
+                except FileContentsException as e:
+                    self.handle_error_message(e.message)
                 except OSError as e:
                     # If the file cannot be opened
@@ -64,9 +63,6 @@
                     msg += e.message
                     self.handle_error_message(msg)
-                except Exception as e:
-                    # Handle any other generic error
-                    # TODO: raise or log?
-                    raise
                 finally:
+                    # Close the file handle if it is open
                     if not self.f_open.closed:
                         self.f_open.close()
@@ -98,5 +94,5 @@
         self.output.append(data_obj)
 
-    def unit_converter(self):
+    def load_unit_converter(self):
         """
         Generic unit conversion import 
@@ -134,4 +130,12 @@
         self.output = final_list
 
+    def set_all_to_none(self):
+        """
+        Set all mutable values to None for error handling purposes
+        """
+        self.current_dataset = None
+        self.current_datainfo = None
+        self.output = []
+
     @staticmethod
     def splitline(line):
Index: src/sas/sascalc/dataloader/loader.py
===================================================================
--- src/sas/sascalc/dataloader/loader.py	(revision 7f75a3fc9b6c1be1b8f3ee54e1879b3fd8f5e4d6)
+++ src/sas/sascalc/dataloader/loader.py	(revision da8bb53be7e5e725c5c588a677fbc7eb7238e129)
@@ -25,9 +25,11 @@
 import logging
 import time
+import mimetypes
 from zipfile import ZipFile
 from sas.sascalc.data_util.registry import ExtensionRegistry
 # Default readers are defined in the readers sub-module
 import readers
-from loader_exceptions import NoKnownLoaderException, FileContentsException
+from loader_exceptions import NoKnownLoaderException, FileContentsException,\
+    DefaultReaderException
 from readers import ascii_reader
 from readers import cansas_reader
@@ -75,15 +77,21 @@
             ascii_loader = ascii_reader.Reader()
             return ascii_loader.read(path)
-        except FileContentsException:
-            pass  # try the cansas XML reader
+        except DefaultReaderException:
+            pass  # Loader specific error to try the cansas XML reader
         try:
             cansas_loader = cansas_reader.Reader()
             return cansas_loader.read(path)
+        except DefaultReaderException:
+            pass  # Loader specific error to try the cansas NeXuS reader
         except FileContentsException:
-            pass  # try the cansas NeXuS reader
+            # TODO: Handle errors properly
+            pass
+        except Exception as csr:
+            # TODO: Modify cansas reader to throw DefaultReaderException
+            pass
         try:
             cansas_nexus_loader = cansas_reader_HDF5.Reader()
             return cansas_nexus_loader.read(path)
-        except FileContentsException:
+        except DefaultReaderException:
             logging.errors("No default loader can load the data")
             # No known reader available. Give up and throw an error
@@ -92,4 +100,7 @@
             msg += "Traceback:\n%s" % e.message
             raise NoKnownLoaderException, msg
+        except FileContentsException:
+            # TODO: Handle error(s) properly
+            pass
 
     def find_plugins(self, dir):
Index: src/sas/sascalc/dataloader/loader_exceptions.py
===================================================================
--- src/sas/sascalc/dataloader/loader_exceptions.py	(revision 270c882bc870c7c9d75e62cd612c28f5cd4e9aaf)
+++ src/sas/sascalc/dataloader/loader_exceptions.py	(revision da8bb53be7e5e725c5c588a677fbc7eb7238e129)
@@ -23,4 +23,13 @@
 
 
+class DefaultReaderException(Exception):
+    """
+    Exception for files with no associated reader. This should be thrown by
+    default readers only to tell Loader to try the next reader.
+    """
+    def __init__(self, e):
+        self.message = e
+
+
 class DataReaderException(Exception):
     """
Index: src/sas/sascalc/dataloader/readers/ascii_reader.py
===================================================================
--- src/sas/sascalc/dataloader/readers/ascii_reader.py	(revision 8ffafd1261e10b3f4556af59ce0dfbe8c7d78c3e)
+++ src/sas/sascalc/dataloader/readers/ascii_reader.py	(revision da8bb53be7e5e725c5c588a677fbc7eb7238e129)
@@ -17,4 +17,6 @@
 from sas.sascalc.dataloader.file_reader_base_class import FileReader
 from sas.sascalc.dataloader.data_info import DataInfo, plottable_1D
+from sas.sascalc.dataloader.loader_exceptions import FileContentsException,\
+    DefaultReaderException
 
 logger = logging.getLogger(__name__)
@@ -110,4 +112,5 @@
                 line_no += 1
             except ValueError:
+                # ValueError is raised when non numeric strings conv. to float
                 # It is data and meet non - number, then stop reading
                 if is_data:
@@ -121,28 +124,31 @@
                 # Reset # of lines of data candidates
                 candidate_lines = 0
-            except Exception:
-                # Handle any unexpected exceptions
-                raise
 
         if not is_data:
-            # TODO: Check file extension - primary reader, throw error.
-            # TODO: Secondary check, pass and try next reader
-            msg = "ascii_reader: x has no data"
-            raise RuntimeError(msg)
+            self.set_all_to_none()
+            if self.extension in self.ext:
+                msg = "ASCII Reader error: Fewer than five Q data points found "
+                msg += "in {}.".format(filepath)
+                raise FileContentsException(msg)
+            else:
+                msg = "ASCII Reader could not load the file {}".format(filepath)
+                raise DefaultReaderException(msg)
         # Sanity check
         if has_error_dy and not len(self.current_dataset.y) == \
                 len(self.current_dataset.dy):
-            msg = "ascii_reader: y and dy have different length"
-            raise RuntimeError(msg)
+            msg = "ASCII Reader error: Number of I and dI data points are"
+            msg += " different in {}.".format(filepath)
+            # TODO: Add error to self.current_datainfo.errors instead?
+            self.set_all_to_none()
+            raise FileContentsException(msg)
         if has_error_dx and not len(self.current_dataset.x) == \
                 len(self.current_dataset.dx):
-            msg = "ascii_reader: y and dy have different length"
-            raise RuntimeError(msg)
-        # If the data length is zero, consider this as
-        # though we were not able to read the file.
-        if len(self.current_dataset.x) < 1:
-            raise RuntimeError("ascii_reader: could not load file")
+            msg = "ASCII Reader error: Number of Q and dQ data points are"
+            msg += " different in {}.".format(filepath)
+            # TODO: Add error to self.current_datainfo.errors instead?
+            self.set_all_to_none()
+            raise FileContentsException(msg)
 
-        # Data
+        # Remove any point where Q == 0
         x = self.current_dataset.x
         self.current_dataset.x = self.current_dataset.x[x != 0]
