Index: src/sas/sascalc/data_util/registry.py
===================================================================
--- src/sas/sascalc/data_util/registry.py	(revision b699768550de9d4b35b087234ec1d2a461922bab)
+++ src/sas/sascalc/data_util/registry.py	(revision 7f75a3fc9b6c1be1b8f3ee54e1879b3fd8f5e4d6)
@@ -7,5 +7,6 @@
 """
 
-import os.path
+from sas.sascalc.dataloader.loader_exceptions import NoKnownLoaderException
+
 
 class ExtensionRegistry(object):
@@ -61,12 +62,16 @@
     def __init__(self, **kw):
         self.loaders = {}
+
     def __setitem__(self, ext, loader):
         if ext not in self.loaders:
             self.loaders[ext] = []
         self.loaders[ext].insert(0,loader)
+
     def __getitem__(self, ext):
         return self.loaders[ext]
+
     def __contains__(self, ext):
         return ext in self.loaders
+
     def formats(self):
         """
@@ -76,4 +81,5 @@
         names.sort()
         return names
+
     def extensions(self):
         """
@@ -83,9 +89,12 @@
         exts.sort()
         return exts
+
     def lookup(self, path):
         """
         Return the loader associated with the file type of path.
         
-        Raises ValueError if file type is not known.
+        :param path: Data file path
+        :raises ValueError: When no loaders are found for the file.
+        :return: List of available readers for the file extension
         """        
         # Find matching extensions
@@ -105,70 +114,31 @@
         # Raise an error if there are no matching extensions
         if len(loaders) == 0:
-            raise ValueError, "Unknown file type for "+path
-        # All done
+            raise ValueError("Unknown file type for "+path)
         return loaders
+
     def load(self, path, format=None):
         """
         Call the loader for the file type of path.
 
-        Raises ValueError if no loader is available.
-        Raises KeyError if format is not available.
-        May raise a loader-defined exception if loader fails.        
+        :raise ValueError: if no loader is available.
+        :raise KeyError: if format is not available.
+        May raise a loader-defined exception if loader fails.
         """
+        loaders = []
         if format is None:
-            loaders = self.lookup(path)
+            try:
+                loaders = self.lookup(path)
+            except ValueError as e:
+                pass
         else:
-            loaders = self.loaders[format]
+            try:
+                loaders = self.loaders[format]
+            except KeyError as e:
+                pass
         for fn in loaders:
             try:
                 return fn(path)
-            except:
-                pass # give other loaders a chance to succeed
+            except Exception as e:
+                pass  # give other loaders a chance to succeed
         # If we get here it is because all loaders failed
-        raise # reraises last exception
-
-def test():
-    reg = ExtensionRegistry()
-    class CxError(Exception): pass
-    def cx(file): return 'cx'
-    def new_cx(file): return 'new_cx'
-    def fail_cx(file): raise CxError
-    def cat(file): return 'cat'
-    def gunzip(file): return 'gunzip'
-    reg['.cx'] = cx
-    reg['.cx1'] = cx
-    reg['.cx'] = new_cx
-    reg['.gz'] = gunzip
-    reg['.cx.gz'] = new_cx
-    reg['.cx1.gz'] = fail_cx
-    reg['.cx1'] = fail_cx
-    reg['.cx2'] = fail_cx
-    reg['new_cx'] = new_cx
-
-    # Two loaders associated with .cx
-    assert reg.lookup('hello.cx') == [new_cx,cx]
-    # Make sure the last loader applies first
-    assert reg.load('hello.cx') == 'new_cx'
-    # Make sure the next loader applies if the first fails
-    assert reg.load('hello.cx1') == 'cx'
-    # Make sure the format override works
-    assert reg.load('hello.cx1',format='.cx.gz') == 'new_cx'
-    # Make sure the format override works
-    assert reg.load('hello.cx1',format='new_cx') == 'new_cx'
-    # Make sure the case of all loaders failing is correct
-    try:  reg.load('hello.cx2')
-    except CxError: pass # correct failure
-    else: raise AssertError,"Incorrect error on load failure"
-    # Make sure the case of no loaders fails correctly
-    try: reg.load('hello.missing')
-    except ValueError,msg:
-        assert str(msg)=="Unknown file type for hello.missing",'Message: <%s>'%(msg)
-    else: raise AssertError,"No error raised for missing extension"
-    assert reg.formats() == ['new_cx']
-    assert reg.extensions() == ['.cx','.cx.gz','.cx1','.cx1.gz','.cx2','.gz']
-    # make sure that it supports multiple '.' in filename
-    assert reg.load('hello.extra.cx1') == 'cx'
-    assert reg.load('hello.gz') == 'gunzip'
-    assert reg.load('hello.cx1.gz') == 'gunzip' # Since .cx1.gz fails
-
-if __name__ == "__main__": test()
+        raise NoKnownLoaderException(e.message)  # raise generic exception
Index: src/sas/sascalc/dataloader/loader.py
===================================================================
--- src/sas/sascalc/dataloader/loader.py	(revision 463e7ffce130ae386f93cd18b87a1120743e88b5)
+++ src/sas/sascalc/dataloader/loader.py	(revision 7f75a3fc9b6c1be1b8f3ee54e1879b3fd8f5e4d6)
@@ -1,5 +1,5 @@
 """
     File handler to support different file extensions.
-    Uses reflectometry's registry utility.
+    Uses reflectometer registry utility.
 
     The default readers are found in the 'readers' sub-module
@@ -29,6 +29,9 @@
 # Default readers are defined in the readers sub-module
 import readers
+from loader_exceptions import NoKnownLoaderException, FileContentsException
 from readers import ascii_reader
 from readers import cansas_reader
+from readers import cansas_reader_HDF5
+
 
 logger = logging.getLogger(__name__)
@@ -39,15 +42,14 @@
     Readers and writers are supported.
     """
-
     def __init__(self):
         super(Registry, self).__init__()
 
-        ## Writers
+        # Writers
         self.writers = {}
 
-        ## List of wildcards
+        # List of wildcards
         self.wildcards = ['All (*.*)|*.*']
 
-        ## Creation time, for testing
+        # Creation time, for testing
         self._created = time.time()
 
@@ -63,18 +65,31 @@
             of a particular reader
 
-        Defaults to the ascii (multi-column) reader
-        if no reader was registered for the file's
-        extension.
+        Defaults to the ascii (multi-column), cansas XML, and cansas NeXuS
+        readers if no reader was registered for the file's extension.
         """
         try:
             return super(Registry, self).load(path, format=format)
-        except:
-            try:
-                # No reader was found. Default to the ascii reader.
-                ascii_loader = ascii_reader.Reader()
-                return ascii_loader.read(path)
-            except:
-                cansas_loader = cansas_reader.Reader()
-                return cansas_loader.read(path)
+        except NoKnownLoaderException as e:
+            pass  # try the ASCII reader
+        try:
+            ascii_loader = ascii_reader.Reader()
+            return ascii_loader.read(path)
+        except FileContentsException:
+            pass  # try the cansas XML reader
+        try:
+            cansas_loader = cansas_reader.Reader()
+            return cansas_loader.read(path)
+        except FileContentsException:
+            pass  # try the cansas NeXuS reader
+        try:
+            cansas_nexus_loader = cansas_reader_HDF5.Reader()
+            return cansas_nexus_loader.read(path)
+        except FileContentsException:
+            logging.errors("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"
+            msg += "Traceback:\n%s" % e.message
+            raise NoKnownLoaderException, msg
 
     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 270c882bc870c7c9d75e62cd612c28f5cd4e9aaf)
@@ -0,0 +1,32 @@
+"""
+Exceptions specific to loading data.
+"""
+
+
+class NoKnownLoaderException(Exception):
+    """
+    Exception for files with no associated reader based on the file
+    extension of the loaded file. This exception should only be thrown by
+    loader.py.
+    """
+    def __init__(self, e):
+        self.message = e
+
+
+class FileContentsException(Exception):
+    """
+    Exception for files with an associated reader, but with no loadable data.
+    This is useful for catching loader or file format issues.
+    """
+    def __init__(self, e):
+        self.message = e
+
+
+class DataReaderException(Exception):
+    """
+    Exception for files that were able to mostly load, but had minor issues
+    along the way.
+    Any exceptions of this type should be put into the datainfo.errors
+    """
+    def __init__(self, e):
+        self.message = e
Index: src/sas/sascalc/dataloader/readers/cansas_reader.py
===================================================================
--- src/sas/sascalc/dataloader/readers/cansas_reader.py	(revision 7432acb919f4013119ca918a73350297e0d4c93f)
+++ src/sas/sascalc/dataloader/readers/cansas_reader.py	(revision 7432acb919f4013119ca918a73350297e0d4c93f)
@@ -29,4 +29,5 @@
 from sas.sascalc.dataloader.readers.xml_reader import XMLreader
 from sas.sascalc.dataloader.readers.cansas_constants import CansasConstants, CurrentLevel
+from sas.sascalc.dataloader.loader_exceptions import FileContentsException
 
 # The following 2 imports *ARE* used. Do not remove either.
@@ -538,5 +539,10 @@
 
         # Load in xml file and get the cansas version from the header
-        self.set_xml_file(xml_file)
+        from lxml import etree
+        try:
+            self.set_xml_file(xml_file)
+        except etree.XMLSyntaxError:
+            msg = "Cansas cannot load this file"
+            raise FileContentsException, msg
         self.cansas_version = self.xmlroot.get("version", "1.0")
 
Index: src/sas/sascalc/dataloader/readers/cansas_reader_HDF5.py
===================================================================
--- src/sas/sascalc/dataloader/readers/cansas_reader_HDF5.py	(revision c94280cac80b38e0a4f88d651999c89b9bbb966d)
+++ src/sas/sascalc/dataloader/readers/cansas_reader_HDF5.py	(revision 7f75a3fc9b6c1be1b8f3ee54e1879b3fd8f5e4d6)
@@ -13,4 +13,5 @@
     TransmissionSpectrum, Detector
 from sas.sascalc.dataloader.data_info import combine_data_info_with_plottable
+from sas.sascalc.dataloader.loader_exceptions import FileContentsException
 
 
@@ -75,5 +76,8 @@
             if extension in self.ext or self.allow_all:
                 # Load the data file
-                self.raw_data = h5py.File(filename, 'r')
+                try:
+                    self.raw_data = h5py.File(filename, 'r')
+                except Exception as e:
+                    raise FileContentsException, e
                 # Read in all child elements of top level SASroot
                 self.read_children(self.raw_data, [])
