Index: src/sas/sascalc/dataloader/file_reader_base_class.py
===================================================================
--- src/sas/sascalc/dataloader/file_reader_base_class.py	(revision 83ee725895955ffec03dbaf3d505aa4cabd552a3)
+++ src/sas/sascalc/dataloader/file_reader_base_class.py	(revision dcb91cf83e474bdbe1c788d87690ca5f5e7841cb)
@@ -84,5 +84,7 @@
         :param msg: Error message
         """
-        if isinstance(self.current_datainfo, DataInfo):
+        if len(self.output) > 0:
+            self.output[-1].errors.append(msg)
+        elif isinstance(self.current_datainfo, DataInfo):
             self.current_datainfo.errors.append(msg)
         else:
@@ -120,5 +122,5 @@
                 if data.dlam is not None:
                     data.dlam = np.asarray([data.dlam[i] for i in ind]).astype(np.float64)
-                if len(data.x > 0):
+                if len(data.x) > 0:
                     data.xmin = np.min(data.x)
                     data.xmax = np.max(data.x)
Index: src/sas/sascalc/dataloader/loader.py
===================================================================
--- src/sas/sascalc/dataloader/loader.py	(revision 3a81cd9e128bba408811bd9fa815588e2fa51d3f)
+++ src/sas/sascalc/dataloader/loader.py	(revision dcb91cf83e474bdbe1c788d87690ca5f5e7841cb)
@@ -69,15 +69,19 @@
         readers if no reader was registered for the file's extension.
         """
+        # Gets set to a string if the file has an associated reader that fails
+        msg_from_reader = None
         try:
             return super(Registry, self).load(path, format=format)
         except NoKnownLoaderException as nkl_e:
-            pass  # try the ASCII reader
+            pass  # Try the ASCII reader
         except FileContentsException as fc_exc:
-            # File has an associated reader but it failed
-            raise RuntimeError(fc_exc.message)
+            # File has an associated reader but it failed.
+            # Save the error message to display later, but try the 3 default loaders
+            msg_from_reader = fc_exc.message
         except Exception:
             pass
 
-        # File has no associated reader - try the ASCII reader
+        # File has no associated reader, or the associated reader failed.
+        # Try the ASCII reader
         try:
             ascii_loader = ascii_reader.Reader()
@@ -86,5 +90,6 @@
             pass  # Loader specific error to try the cansas XML reader
         except FileContentsException as e:
-            raise RuntimeError(e.message)
+            if msg_from_reader is None:
+                raise RuntimeError(e.message)
 
         # ASCII reader failed - try CanSAS xML reader
@@ -95,6 +100,7 @@
             pass  # Loader specific error to try the NXcanSAS reader
         except FileContentsException as e:
-            raise RuntimeError(e.message)
-        except Exception as csr:
+            if msg_from_reader is None:
+                raise RuntimeError(e.message)
+        except Exception:
             pass
 
@@ -106,9 +112,15 @@
             logging.error("No default loader can load the data")
             # No known reader available. Give up and throw an error
-            msg = "\n\tUnknown data format: %s.\n\tThe file is not a " % path
-            msg += "known format that can be loaded by SasView.\n"
-            raise NoKnownLoaderException(msg)
+            if msg_from_reader is None:
+                msg = "\nUnknown data format: {}.\nThe file is not a ".format(path)
+                msg += "known format that can be loaded by SasView.\n"
+                raise NoKnownLoaderException(msg)
+            else:
+                # Associated reader and default readers all failed.
+                # Show error message from associated reader
+                raise RuntimeError(msg_from_reader)
         except FileContentsException as e:
-            raise RuntimeError(e.message)
+            err_msg = msg_from_reader if msg_from_reader is not None else e.message
+            raise RuntimeError(err_msg)
 
     def find_plugins(self, dir):
Index: src/sas/sascalc/dataloader/readers/cansas_reader.py
===================================================================
--- src/sas/sascalc/dataloader/readers/cansas_reader.py	(revision 248ff7332a99edb391f42db2a242a497473df452)
+++ src/sas/sascalc/dataloader/readers/cansas_reader.py	(revision dcb91cf83e474bdbe1c788d87690ca5f5e7841cb)
@@ -157,9 +157,9 @@
                     raise DataReaderException(invalid_xml) # Handled by base class
                 except FileContentsException as fc_exc:
-                    if not self.extension in self.ext: # If the file has no associated loader
-                        raise DefaultReaderException(msg)
                     msg = "CanSAS Reader could not load the file {}".format(xml_file)
                     if fc_exc.message is not None: # Propagate error messages from earlier
                         msg = fc_exc.message
+                    if not self.extension in self.ext: # If the file has no associated loader
+                        raise DefaultReaderException(msg)
                     raise FileContentsException(msg)
                     pass
@@ -179,5 +179,5 @@
             self.set_xml_file(xml_file)
         except etree.XMLSyntaxError: # File isn't valid XML so can't be loaded
-            msg = "Cansas cannot load {}.\n Invalid XML syntax".format(xml_file)
+            msg = "SasView cannot load {}.\nInvalid XML syntax".format(xml_file)
             raise FileContentsException(msg)
 
@@ -207,4 +207,5 @@
             return True # Why is this required?
         # If we get to this point then file isn't valid CanSAS
+        logger.warning("File doesn't meet CanSAS schema. Trying to load anyway.")
         raise FileContentsException("The file is not valid CanSAS")
 
Index: src/sas/sascalc/dataloader/readers/cansas_reader_HDF5.py
===================================================================
--- src/sas/sascalc/dataloader/readers/cansas_reader_HDF5.py	(revision 8dec7e72746c7b410e4a41ad46431efab344c6c2)
+++ src/sas/sascalc/dataloader/readers/cansas_reader_HDF5.py	(revision dcb91cf83e474bdbe1c788d87690ca5f5e7841cb)
@@ -82,12 +82,20 @@
                         raise DefaultReaderException(msg)
                     raise FileContentsException(e.message)
-                # Read in all child elements of top level SASroot
-                self.read_children(self.raw_data, [])
-                # Add the last data set to the list of outputs
-                self.add_data_set()
-                # Close the data file
-                self.raw_data.close()
-        # Return data set(s)
-        return self.output
+                try:
+                    # Read in all child elements of top level SASroot
+                    self.read_children(self.raw_data, [])
+                    # Add the last data set to the list of outputs
+                    self.add_data_set()
+                except Exception as exc:
+                    raise FileContentsException(exc.message)
+                finally:
+                    # Close the data file
+                    self.raw_data.close()
+
+                for dataset in self.output:
+                    if isinstance(dataset, Data1D):
+                        if dataset.x.size < 5:
+                            self.output = []
+                            raise FileContentsException("Fewer than 5 data points found.")
 
     def reset_class_variables(self):
Index: src/sas/sascalc/file_converter/ascii2d_loader.py
===================================================================
--- src/sas/sascalc/file_converter/ascii2d_loader.py	(revision 0f010c953c23444d55969cc9433efb071f90375f)
+++ src/sas/sascalc/file_converter/ascii2d_loader.py	(revision dcb91cf83e474bdbe1c788d87690ca5f5e7841cb)
@@ -13,6 +13,6 @@
 # 2: q_y axis label and units
 # 3: Intensity axis label and units
-# 4: nUseRec - number of lines of user content following this line
-# 5 - 5+nUseRec: user content
+# 4: n_use_rec - number of lines of user content following this line
+# 5 to (5+n_use_rec): user content
 # Number of qx points
 # List of qx points
@@ -34,110 +34,117 @@
 
         :return: A Data2D instance containing data from the file
-        :raises ValueError: Raises a ValueError if the file is incorrectly formatted
+        :raises ValueError: Raises a ValueError if the file is incorrectly
+            formatted
         """
-        file_handle = open(self.data_path, 'r')
-        file_buffer = file_handle.read()
-        all_lines = file_buffer.splitlines()
+        with open(self.data_path, 'r') as file_handle:
+            file_buffer = file_handle.read()
+            all_lines = file_buffer.splitlines()
 
-        # Load num_points line-by-line from lines into a numpy array, starting
-        # on line number start_line
-        def _load_points(lines, start_line, num_points):
-            qs = np.zeros(num_points)
-            n = start_line
-            filled = 0
-            while filled < num_points:
-                row = np.fromstring(lines[n], dtype=np.float32, sep=' ')
-                qs[filled:filled+len(row)] = row
-                filled += len(row)
-                n += 1
-            return n, qs
+            # Load num_points line-by-line from lines into a numpy array,
+            # starting on line number start_line
+            def _load_points(lines, start_line, num_points):
+                qs = np.zeros(num_points)
+                n = start_line
+                filled = 0
+                while filled < num_points:
+                    row = np.fromstring(lines[n], dtype=np.float32, sep=' ')
+                    qs[filled:filled+len(row)] = row
+                    filled += len(row)
+                    n += 1
+                return n, qs
 
-        current_line = 4
-        try:
-            # Skip nUseRec lines
-            nUseRec = int(all_lines[current_line].strip()[0])
-            current_line += nUseRec + 1
-            # Read qx data
-            num_qs = int(all_lines[current_line].strip())
+            current_line = 4
+            try:
+                # Skip n_use_rec lines
+                n_use_rec = int(all_lines[current_line].strip()[0])
+                current_line += n_use_rec + 1
+                # Read qx data
+                num_qs = int(all_lines[current_line].strip())
+                current_line += 1
+                current_line, qx = _load_points(all_lines, current_line, num_qs)
+
+                # Read qy data
+                num_qs = int(all_lines[current_line].strip())
+                current_line += 1
+                current_line, qy = _load_points(all_lines, current_line, num_qs)
+            except ValueError as e:
+                err_msg = "File incorrectly formatted.\n"
+                if str(e).find('broadcast') != -1:
+                    err_msg += "Incorrect number of q data points provided. "
+                    err_msg += "Expected {}.".format(num_qs)
+                elif str(e).find('invalid literal') != -1:
+                    err_msg += ("Expected integer on line {}. "
+                        "Instead got '{}'").format(current_line + 1,
+                            all_lines[current_line])
+                else:
+                    err_msg += str(e)
+                raise ValueError(err_msg)
+
+            # dimensions: [width, height, scale]
+            try:
+                dimensions = np.fromstring(all_lines[current_line],
+                    dtype=np.float32, sep=' ')
+                if len(dimensions) != 3: raise ValueError()
+                width = int(dimensions[0])
+                height = int(dimensions[1])
+            except ValueError as e:
+                err_msg = "File incorrectly formatted.\n"
+                err_msg += ("Expected line {} to be of the form: <num_qx> "
+                    "<num_qy> <scale>.").format(current_line + 1)
+                err_msg += " Instead got '{}'.".format(all_lines[current_line])
+                raise ValueError(err_msg)
+
+            if width > len(qx) or height > len(qy):
+                err_msg = "File incorrectly formatted.\n"
+                err_msg += ("Line {} says to use {}x{} points. "
+                    "Only {}x{} provided.").format(current_line + 1, width,
+                    height, len(qx), len(qy))
+                raise ValueError(err_msg)
+
+            # More qx and/or qy points can be provided than are actually used
+            qx = qx[:width]
+            qy = qy[:height]
+
             current_line += 1
-            current_line, qx = _load_points(all_lines, current_line, num_qs)
+            # iflag = 1 => Only intensity data (not dealt with here)
+            # iflag = 2 => q axis and intensity data
+            # iflag = 3 => q axis, intensity and error data
+            try:
+                iflag = int(all_lines[current_line].strip()[0])
+                if iflag <= 0 or iflag > 3: raise ValueError()
+            except:
+                err_msg = "File incorrectly formatted.\n"
+                iflag = all_lines[current_line].strip()[0]
+                err_msg += ("Expected iflag on line {} to be 1, 2 or 3. "
+                    "Instead got '{}'.").format(current_line+1, iflag)
+                raise ValueError(err_msg)
 
-            # Read qy data
-            num_qs = int(all_lines[current_line].strip())
             current_line += 1
-            current_line, qy = _load_points(all_lines, current_line, num_qs)
-        except ValueError as e:
-            err_msg = "File incorrectly formatted.\n"
-            if str(e).find('broadcast') != -1:
-                err_msg += "Incorrect number of q data points provided. "
-                err_msg += "Expected {}.".format(num_qs)
-            elif str(e).find('invalid literal') != -1:
-                err_msg += "Expected integer on line {}. Instead got '{}'".format(current_line + 1,
-                    all_lines[current_line])
-            else:
-                err_msg += str(e)
-            raise ValueError(err_msg)
 
-        # dimensions: [width, height, scale]
-        try:
-            dimensions = np.fromstring(all_lines[current_line], dtype=np.float32, sep=' ')
-            if len(dimensions) != 3: raise ValueError()
-            width = int(dimensions[0])
-            height = int(dimensions[1])
-        except ValueError as e:
-            err_msg = "File incorrectly formatted.\n"
-            err_msg += "Expected line {} to be of the form: <num_qx> <num_qy> <scale>.".format(current_line + 1)
-            err_msg += " Instead got '{}'.".format(all_lines[current_line])
-            raise ValueError(err_msg)
+            try:
+                current_line, I = _load_points(all_lines, current_line,
+                    width * height)
+                dI = np.zeros(width*height)
 
-        if width > len(qx) or height > len(qy):
-            err_msg = "File incorrectly formatted.\n"
-            err_msg += ("Line {} says to use {}x{} points. "
-                "Only {}x{} provided.").format(current_line + 1, width, height,
-                len(qx), len(qy))
-            raise ValueError(err_msg)
+                # Load error data if it's provided
+                if iflag == 3:
+                    _, dI = _load_points(all_lines, current_line, width*height)
+            except Exception as e:
+                err_msg = "File incorrectly formatted.\n"
+                if str(e).find("list index") != -1:
+                    err_msg += ("Incorrect number of data points. Expected {}"
+                        " intensity").format(width * height)
+                    if iflag == 3:
+                        err_msg += " and error"
+                    err_msg += " points."
+                else:
+                    err_msg += str(e)
+                raise ValueError(err_msg)
 
-        # More qx and/or qy points can be provided than are actually used
-        qx = qx[:width]
-        qy = qy[:height]
+            # Format data for use with Data2D
+            qx = list(qx) * height
+            qy = np.array([[y] * width for y in qy]).flatten()
 
-        current_line += 1
-        # iflag = 1 => Only intensity data (not dealt with here)
-        # iflag = 2 => q axis and intensity data
-        # iflag = 3 => q axis, intensity and error data
-        try:
-            iflag = int(all_lines[current_line].strip()[0])
-            if iflag <= 0 or iflag > 3: raise ValueError()
-        except:
-            err_msg = "File incorrectly formatted.\n"
-            iflag = all_lines[current_line].strip()[0]
-            err_msg += "Expected iflag on line {} to be 1, 2 or 3. Instead got '{}'.".format(current_line+1, iflag)
-            raise ValueError(err_msg)
-
-        current_line += 1
-
-        try:
-            current_line, I = _load_points(all_lines, current_line, width*height)
-            dI = np.zeros(width*height)
-
-            # Load error data if it's provided
-            if iflag == 3:
-                _, dI = _load_points(all_lines, current_line, width*height)
-        except Exception as e:
-            err_msg = "File incorrectly formatted.\n"
-            if str(e).find("list index") != -1:
-                err_msg += ("Incorrect number of data points. Expected {} intensity").format(width*height)
-                if iflag == 3:
-                    err_msg += " and error"
-                err_msg += " points."
-            else:
-                err_msg += str(e)
-            raise ValueError(err_msg)
-
-        # Format data for use with Data2D
-        qx = list(qx) * height
-        qy = np.array([[y] * width for y in qy]).flatten()
-
-        data = Data2D(qx_data=qx, qy_data=qy, data=I, err_data=dI)
+            data = Data2D(qx_data=qx, qy_data=qy, data=I, err_data=dI)
 
         return data
Index: src/sas/sasgui/guiframe/local_perspectives/data_loader/data_loader.py
===================================================================
--- src/sas/sasgui/guiframe/local_perspectives/data_loader/data_loader.py	(revision fafe52a82bebe8d8a20bfb820388c964aa3c4b7b)
+++ src/sas/sasgui/guiframe/local_perspectives/data_loader/data_loader.py	(revision dcb91cf83e474bdbe1c788d87690ca5f5e7841cb)
@@ -224,5 +224,5 @@
             except NoKnownLoaderException as e:
                 exception_occurred = True
-                logging.error(e.message)
+                logger.error(e.message)
 
                 error_message = "Loading data failed!\n" + e.message
