diff --git a/firanka/exceptions.py b/firanka/exceptions.py
index d827061af5c53c1d0bd540a7bb068e6b5e92b43d..772176086a4f77f43b2f042e594f7cfef9dea8d9 100644
--- a/firanka/exceptions.py
+++ b/firanka/exceptions.py
@@ -14,11 +14,16 @@ class FirankaError(Exception):
     """
 
 
-class DomainError(FirankaError):
+class DomainError(FirankaError, ValueError):
     """Has something to do with the domain :)"""
 
 
-class NotInDomainError(DomainError, ValueError):
+class NotInDomainError(DomainError):
     """
     Requested index is beyond this domain
     """
+
+    def __init__(self, index, domain):
+        super(NotInDomainError, self).__init__('NotInDomainError: %s not in %s' % (index, domain))
+        self.index = index
+        self.domain = domain
diff --git a/firanka/intervals.py b/firanka/intervals.py
index 0ed8eb73484b0938f5ea9c51a20378c1b073dac4..a1eee1ca2c4ad406524aff3ad322a6789721bfa0 100644
--- a/firanka/intervals.py
+++ b/firanka/intervals.py
@@ -5,6 +5,8 @@ import math
 
 import six
 
+from .exceptions import NotInDomainError
+
 __all__ = [
     'Interval',
     'REAL_SET',
@@ -156,6 +158,14 @@ class Interval(object):
             repr(self.start), repr(self.stop), repr(self.left_inc),
             repr(self.right_inc))
 
+    def contains_or_fail(self, p):
+        """
+        If p is not in this interval, NotInDomainError will be thrown
+        :param p: float
+        """
+        if p not in self:
+            raise NotInDomainError(p, self)
+
     def __getitem__(self, item):
         if not isinstance(item, slice):
             raise TypeError('must be a slice')
diff --git a/firanka/series/base.py b/firanka/series/base.py
index aee8b2297690b3320e437527231b9bd079bfae12..381e749b2b9436b81fef1357f00ed8a50292fbee 100644
--- a/firanka/series/base.py
+++ b/firanka/series/base.py
@@ -5,7 +5,7 @@ import inspect
 
 from sortedcontainers import SortedList
 
-from firanka.exceptions import NotInDomainError, DomainError
+from firanka.exceptions import DomainError
 from firanka.intervals import Interval, EMPTY_SET
 
 
@@ -39,14 +39,10 @@ class Series(object):
             if isinstance(item, slice):
                 item = Interval(item)
 
-            if item not in self.domain:
-                raise NotInDomainError('slicing beyond series domain')
-
+            self.domain.contains_or_fail(item)
             return AlteredSeries(self, domain=self.domain.intersection(item))
         else:
-            if item not in self.domain:
-                raise NotInDomainError('item not in domain')
-
+            self.domain.contains_or_fail(item)
             return self._get_for(item)
 
     def _get_for(self, item):
@@ -82,8 +78,7 @@ class Series(object):
 
         domain = domain or Interval(points[0], points[-1], True, True)
 
-        if domain not in self.domain:
-            raise NotInDomainError('points not inside this series!')
+        self.domain.contains_or_fail(domain)
 
         return DiscreteSeries([(i, self[i]) for i in points], domain)