diff --git a/cinder/objects/base.py b/cinder/objects/base.py
index 61498370d8a..2d012848d87 100644
--- a/cinder/objects/base.py
+++ b/cinder/objects/base.py
@@ -238,7 +238,13 @@ class CinderObjectDictCompat(base.VersionedObjectDictCompat):
                 not self.obj_attr_is_set(key)):
             return value
         else:
-            return getattr(self, key)
+            try:
+                return getattr(self, key)
+            except (exception.ObjectActionError, NotImplementedError):
+                # Exception when haven't set a value for non-lazy
+                # loadable attribute, but to mimic typical dict 'get'
+                # behavior we should still return None
+                return None
 
     def __contains__(self, name):
         try:
diff --git a/cinder/tests/unit/objects/test_base.py b/cinder/tests/unit/objects/test_base.py
index 6e95124c334..cb14df5f5e5 100644
--- a/cinder/tests/unit/objects/test_base.py
+++ b/cinder/tests/unit/objects/test_base.py
@@ -559,6 +559,7 @@ class TestCinderDictObject(test_objects.BaseObjectsTestCase):
         obj = self.TestDictObject()
         self.assertIsNone(obj.get('non_existing'))
         self.assertEqual('val', obj.get('abc', 'val'))
+        self.assertIsNone(obj.get('abc'))
         obj.abc = 'val2'
         self.assertEqual('val2', obj.get('abc', 'val'))
         self.assertEqual(42, obj.get('foo'))