Add optional 'onerror' argument to os.walk(), to control error
handling.
diff --git a/Doc/lib/libos.tex b/Doc/lib/libos.tex
index dd492bb..074d332 100644
--- a/Doc/lib/libos.tex
+++ b/Doc/lib/libos.tex
@@ -1054,7 +1054,8 @@
 Availability: Macintosh, \UNIX, Windows.
 \end{funcdesc}
 
-\begin{funcdesc}{walk}{top\optional{, topdown\code{=True}}}
+\begin{funcdesc}{walk}{top\optional{, topdown\code{=True}
+                       \optional{, onerror\code{=None}}}}
 \index{directory!walking}
 \index{directory!traversal}
 \function{walk()} generates the file names in a directory tree, by
@@ -1087,6 +1088,13 @@
 false is ineffective, because in bottom-up mode the directories in
 \var{dirnames} are generated before \var{dirnames} itself is generated.
 
+By default errors from the \code{os.listdir()} call are ignored.  If
+optional argument \var{onerror} is specified, it should be a function;
+it will be called with one argument, an os.error instance.  It can
+report the error to continue with the walk, or raise the exception
+to abort the walk.  Note that the filename is available as the
+\code{filename} attribute of the exception object.
+
 \begin{notice}
 If you pass a relative pathname, don't change the current working
 directory between resumptions of \function{walk()}.  \function{walk()}
diff --git a/Lib/os.py b/Lib/os.py
index 69d1a44..e493ad0 100644
--- a/Lib/os.py
+++ b/Lib/os.py
@@ -203,7 +203,7 @@
 
 __all__.extend(["makedirs", "removedirs", "renames"])
 
-def walk(top, topdown=True):
+def walk(top, topdown=True, onerror=None):
     """Directory tree generator.
 
     For each directory in the directory tree rooted at top (including top
@@ -232,6 +232,13 @@
     dirnames have already been generated by the time dirnames itself is
     generated.
 
+    By default errors from the os.listdir() call are ignored.  If
+    optional arg 'onerror' is specified, it should be a function; it
+    will be called with one argument, an os.error instance.  It can
+    report the error to continue with the walk, or raise the exception
+    to abort the walk.  Note that the filename is available as the
+    filename attribute of the exception object.
+
     Caution:  if you pass a relative pathname for top, don't change the
     current working directory between resumptions of walk.  walk never
     changes the current directory, and assumes that the client doesn't
@@ -259,7 +266,9 @@
         # Note that listdir and error are globals in this module due
         # to earlier import-*.
         names = listdir(top)
-    except error:
+    except error, err:
+        if onerror is not None:
+            onerror(err)
         return
 
     dirs, nondirs = [], []
@@ -274,7 +283,7 @@
     for name in dirs:
         path = join(top, name)
         if not islink(path):
-            for x in walk(path, topdown):
+            for x in walk(path, topdown, onerror):
                 yield x
     if not topdown:
         yield top, dirs, nondirs
diff --git a/Misc/NEWS b/Misc/NEWS
index d8a95a2..26b543b 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -38,6 +38,9 @@
 Library
 -------
 
+- Added optional 'onerror' argument to os.walk(), to control error
+  handling.
+
 - inspect.is{method|data}descriptor was added, to allow pydoc display
   __doc__ of data descriptors.