尝试;最后没有例外?

try; finally without except?

提问人:roulette01 提问时间:9/15/2023 最后编辑:jarlhroulette01 更新时间:9/15/2023 访问量:130

问:

假设我正在做一些sql查询:

try:
  some_cursor.execute(sql_query) 
finally:
  some_cursor.close()

与上述有什么区别吗?

some_cursor.execute(sql_query) 
some_cursor.close()

它们似乎是等效的,因为没有异常处理。 我确实记得读过,如果有错误,那么在后一种关闭中可能无法正确关闭光标,但前一种情况的块可以确保这一点吗?some_cursor.execute(sql_query) finally

python 异常 try-catch

评论

2赞 Codist 9/15/2023
使用 try/finally 即使 try 和 finally 之间的代码引发异常,仍然会执行 finally 块
0赞 roulette01 9/15/2023
@DarkKnight当然,但在这种情况下,它只是关闭光标,对吧?所以我认为当抛出异常时,这 2 是等价的。在第二种情况下,如果失败,那么程序将终止,并且光标会自动关闭,对吧?some_cursor.execute(sql_query)
0赞 JonSG 9/15/2023
在第二个代码块中,如果 raise 和 exception 则不会像第一个代码块中那样调用,也不会像使用execute()close()with
1赞 H.Syd 9/15/2023
是的,这是有区别的。如果没有 try 块,如果程序在 execute 方法中遇到错误,它将在到达 close 方法之前终止。使用 try 块时,当在执行该块中的任何代码期间引发任何异常时,将执行 finally 块。因此,即使引发异常,也会调用 close 方法。不管你是否真的排除了异常,并相应地处理它,最终块将始终被执行。
2赞 Barmar 9/15/2023
请注意,发生异常时,脚本可能不会终止。如果此代码位于函数中,则可能有一些外部代码捕获异常。这是一个很好的设计,使你的函数无论如何调用它们都保持一致。try/except

答:

1赞 Erfan 9/15/2023 #1

最重要(也许也是显而易见的)区别是,您不再捕获在执行查询期间可能发生的异常。因此,如果失败,您将永远无法到达下一行(即光标不会关闭),因为程序将终止(或退出外部块,如注释中指出的那样@Barmar)。虽然某些数据库库和 Python 数据库驱动程序可能会在程序退出时自动关闭资源,但不建议依赖此行为,因为它可能导致资源泄漏和其他问题。 包含您的“清理”命令,这些命令将确保无论块内发生什么情况,光标都将关闭。 有关详细信息,请参阅 Python 的文档some_cursor.execute(sql_query)try/exceptfinallytry