如何在except子句中捕获python异常
如何在python中捕获异常中的异常 考虑以下情况如何在except子句中捕获python异常,python,file,exception,try-catch,Python,File,Exception,Try Catch,如何在python中捕获异常中的异常 考虑以下情况 bak_filename = filename + ".bak" #This try is needed because if bak_filename existed, rename will fail try: os.rename(filename, bak_filename) except WindowsError: #However, os.remove may still fail e.g. file in use. Ho
bak_filename = filename + ".bak"
#This try is needed because if bak_filename existed, rename will fail
try:
os.rename(filename, bak_filename)
except WindowsError:
#However, os.remove may still fail e.g. file in use. How would you handle this exception within except clause ?
#try and except around this os.remove?
os.remove(bak_filename)
os.rename(filename, bak_filename)
有没有想过:
避免所有这些异常包装的解决方案是使用 如果目标已存在但不是目录,则可能会根据os.rename()语义将其覆盖 如果目标位于当前文件系统上,则使用os.rename()。否则,使用copy_函数将src复制到dst,然后将其删除。对于符号链接,将在dst中或作为dst创建指向src目标的新符号链接,并删除src 所以它基本上完成了您想要做的事情,但是在所有python发行版上都可以使用的库中 请注意,如果文件很大且目标文件存在,并且
os.rename
拒绝覆盖该文件,则性能可能会很差(完全取决于操作系统,但例如Windows将拒绝重命名现有文件),因为os.rename
抛出OSError
时的回退是复制源,然后删除。该实现不会尝试删除文件,然后再次重命名,因为如果rename
失败,Python会假定我们正在尝试跨文件系统重命名,在这种情况下,复制+删除是正确的(Unixmv
正是这样工作的)
为了解决可能存在的文件问题,可以使用try/except-OSError
语句完成先前的os.remove
调用
try:
os.remove(bak_filename)
except OSError:
pass
shutil.move(filename, bak_filename) # or os.rename(filename, bak_filename)
当然,如果bak_filename
被锁定/不可删除,则shutil.mode
仍会引发异常。还要注意,如果我们试图删除目标文件,os.rename
将与shutil.move
一样有效。如果无法删除目标文件,操作将无法成功。您可以阅读有关的详细信息。但是,这是针对Python3的
在Python 2中,您可以将异常存储在一个变量中,然后再次显式地引发它,如下所示:
try:
do something
except Exception as e:
try:
do something again
except:
pass
raise e
把
try/except
放在os.remove()
周围有什么不对?从我的一些经验和阅读中可以看出,这将是一个混乱和难以调试的程序包。听起来像是一个有趣的包,但是我没有管理员权限随意安装软件包,并且需要坚持使用OSI。你不需要安装这个。这是内置的。
try:
os.remove(bak_filename)
except OSError:
pass
shutil.move(filename, bak_filename) # or os.rename(filename, bak_filename)
try:
do something
except Exception as e:
try:
do something again
except:
pass
raise e