New submission from Daisy Choi <m...@floozutter.site>:

shutil.copytree's docstring [1] and documentation [2] states that, "If 
exception(s) occur, an Error is raised with a list of reasons," but it can 
raise OSErrors at the top-level call. For example:

>>> import shutil
>>> shutil.copytree(nonexistent_dir, dst)
FileNotFoundError: [WinError 3] The system cannot find the path specified: '...'

>>> shutil.copytree(actually_a_file, dst)
NotADirectoryError: [WinError 267] The directory name is invalid: '...'

>>> shutil.copytree(src, dst_already_exists, dirs_exist_ok=False)
FileExistsError: [WinError 183] Cannot create a file when that file already 
exists: '...'

The errors above happen because shutil.copytree and shutil._copytree call 
os.scandir and os.makedir respectively without wrapping any exceptions inside 
shutil.Error. [3][4]


It seems like shutil.copytree(src, dst) only raises a shutil.Error if an 
OSError or shutil.Error was raised when copying over a file in src or during a 
recursive call to shutil.copytree for a subdirectory of src:

>>> shutil.copytree(dir_with_broken_symblink, dst)
shutil.Error: [('a\\symlink', 'b\\symlink', "[Errno 2] No such file or 
directory: 'a\\\\symlink'")]


Is this behavior intended? Should shutil.copytree be changed so that exceptions 
for the top level are wrapped inside shutil.Error, or should the documentation 
for shutil.copytree mention that it can raise exceptions that aren't 
shutil.Error? (Or is this just a non-issue?)


[1]: 
https://github.com/python/cpython/blob/b494f5935c92951e75597bfe1c8b1f3112fec270/Lib/shutil.py#L522
[2]: 
https://docs.python.org/3.10/library/shutil.html?highlight=shutil#shutil.copytree
[3]: 
https://github.com/python/cpython/blob/b494f5935c92951e75597bfe1c8b1f3112fec270/Lib/shutil.py#L554
[4]: 
https://github.com/python/cpython/blob/b494f5935c92951e75597bfe1c8b1f3112fec270/Lib/shutil.py#L457

----------
components: Library (Lib)
messages: 407413
nosy: Floozutter
priority: normal
severity: normal
status: open
title: shutil.copytree can raise OSErrors not wrapped in shutil.Error
type: behavior
versions: Python 3.10

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

Reply via email to