Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在except子句中捕获python异常_Python_File_Exception_Try Catch - Fatal编程技术网

如何在except子句中捕获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

如何在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. 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)
有没有想过:

  • 重写以避免重复尝试

  • 不一定是这个例子,但在某些情况下我们无法重写,您将如何处理doubletry


  • 避免所有这些异常包装的解决方案是使用

    如果目标已存在但不是目录,则可能会根据os.rename()语义将其覆盖

    如果目标位于当前文件系统上,则使用os.rename()。否则,使用copy_函数将src复制到dst,然后将其删除。对于符号链接,将在dst中或作为dst创建指向src目标的新符号链接,并删除src

    所以它基本上完成了您想要做的事情,但是在所有python发行版上都可以使用的库中

    请注意,如果文件很大且目标文件存在,并且
    os.rename
    拒绝覆盖该文件,则性能可能会很差(完全取决于操作系统,但例如Windows将拒绝重命名现有文件),因为
    os.rename
    抛出
    OSError
    时的回退是复制源,然后删除。该实现不会尝试删除文件,然后再次重命名,因为如果
    rename
    失败,Python会假定我们正在尝试跨文件系统重命名,在这种情况下,复制+删除是正确的(Unix
    mv
    正是这样工作的)

    为了解决可能存在的文件问题,可以使用
    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