Issue 1592:  Better error reporting for operations on closed shelves.
diff --git a/Lib/shelve.py b/Lib/shelve.py
index 7a75445..2a430f3 100644
--- a/Lib/shelve.py
+++ b/Lib/shelve.py
@@ -73,6 +73,16 @@
 
 __all__ = ["Shelf","BsdDbShelf","DbfilenameShelf","open"]
 
+class _ClosedDict(UserDict.DictMixin):
+    'Marker for a closed dict.  Access attempts raise a ValueError.'
+
+    def closed(self, *args):
+        raise ValueError('invalid operation on closed shelf')
+    __getitem__ = __setitem__ = __delitem__ = keys = closed
+
+    def __repr__(self):
+        return '<Closed Dictionary>'
+
 class Shelf(UserDict.DictMixin):
     """Base class for shelf implementations.
 
@@ -136,7 +146,7 @@
             self.dict.close()
         except AttributeError:
             pass
-        self.dict = 0
+        self.dict = _ClosedDict()
 
     def __del__(self):
         if not hasattr(self, 'writeback'):