当处理尝试创建现有文件或尝试使用不存在的文件时发生的错误时,被抛出的OSError
有一个子类(FileExistsError
,{{1 }})。
确切的错误消息是:
FileNotFoundError
我想捕获文件名太长时发生的OSError,但仅当文件名太长时才会发生。我不想要捕获可能发生的其他OSError: [Errno 36] File name too long: 'filename'
。有没有办法实现这个目标?
编辑:我知道我可以根据长度检查文件名,但根据操作系统和文件系统,最大文件名长度变化太大,我没有看到“干净”的解决方案方式。
答案 0 :(得分:5)
只需检查已捕获异常的errno
属性。
try:
do_something()
except OSError as exc:
if exc.errno == 36:
handle_filename_too_long()
else:
raise # re-raise previously caught exception
为了便于阅读,您可以考虑使用errno
built-in module中的适当常量而不是硬编码常量。
答案 1 :(得分:2)
您可以指定捕获特定错误的方式,例如errno.ENAMETOOLONG:
特定于您的问题......
if (!in_array($title, $checklist)) {
$checklist[] = $title;
$result[] = $item;
}
特定于您的评论......
try:
# try stuff
except OSError as oserr:
if oserr.errno != errno.ENAMETOOLONG:
# ignore
else:
# caught...now what?
这将抓取try:
# try stuff
except Exception as err:
# get the name attribute from the exception class
errname = type(err).__name__
# get the errno attribute from the exception class
errnum = err.errno
if (errname == 'OSError') and (errnum == errno.ENAMETOOLONG):
# handle specific to OSError [Errno 36]
else if (errname == 'ExceptionNameHere' and ...:
# handle specific to blah blah blah
.
.
.
else:
raise # if you want to re-raise; otherwise code your ignore
中由错误引起的所有异常。然后它检查try
是否匹配任何特定异常以及您要指定的任何其他条件。
如果遇到错误,您应该知道__name__
没有问题,除非您具体说明具体异常。