Eryk Sun <eryk...@gmail.com> added the comment:

> The doc on rmtree states 
> Exceptions raised by onerror will not be caught.
> Does this mean I can't use try/exept inside of onerro

rmtree() does not call onerror() in a try/except statement. An exception raised 
in onerror() will propagate to the scope that called rmtree().

The documentation has an example onerror() handler for Windows readonly files:

    import os, stat
    import shutil

    def remove_readonly(func, path, _):
        "Clear the readonly bit and reattempt the removal"
        os.chmod(path, stat.S_IWRITE)
        func(path)

    shutil.rmtree(directory, onerror=remove_readonly)

I'd check whether the exception and function are expected values. For example:

    import os, stat
    import shutil

    def remove_readonly(func, path, exc_info):
        "Clear the readonly bit and reattempt the removal"
        # ERROR_ACCESS_DENIED = 5
        if func not in (os.unlink, os.rmdir) or exc_info[1].winerror != 5:
            raise exc_info[1]
        os.chmod(path, stat.S_IWRITE)
        func(path)

    shutil.rmtree(directory, onerror=remove_readonly)

----------
nosy: +eryksun
type: crash -> behavior

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue43657>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to