Python异常和流控制:究竟是什么;意料之外的;? 我听说在流控制中使用“try-except”是需要避免的,而异常应该只用于意外情况,因此显然不鼓励使用[Code A],而应该使用[Code B]。我理解对了吗

Python异常和流控制:究竟是什么;意料之外的;? 我听说在流控制中使用“try-except”是需要避免的,而异常应该只用于意外情况,因此显然不鼓励使用[Code A],而应该使用[Code B]。我理解对了吗,python,Python,关于异常的最常见解释是通过文件操作完成的,因此我也将通过文件处理完成: from pathlib import Path my_file_path = Path("./something.txt") #### # Code A : This is a bad practice #### try : content = open (my_file_path, 'r').read() except FileNotFoundError as e : content

关于异常的最常见解释是通过文件操作完成的,因此我也将通过文件处理完成:

from pathlib import Path
my_file_path = Path("./something.txt")

####
# Code A : This is a bad practice
####
try :
    content = open (my_file_path, 'r').read()
except FileNotFoundError as e :
    content = ""
    create_file(my_file_path)
然而,我的困惑是,如果我的程序期望我的文件路径存在,但在一些罕见的情况下可能会发生异常,比如服务器崩溃,或者说从主服务器取消同步,该怎么办

我的假设是“可能文件在第一次运行时不存在,所以文件不存在是一个预期的流”应该转到if-else语句,因为我不应该控制有异常的流

因此,我的问题2是:

  • 然而,如果我真的打算让我的程序总是“提前准备好文件”,我是否可以“证明”使用异常(尽管事实上我知道在罕见的情况下,比如服务器崩溃,它可能不存在)?或者这种“罕见情况”也应该由if语句来处理

  • 这里相当混乱,或者我只是误解了异常的使用?

    异常的使用与其说是“意外”错误,不如说是针对偏离正常执行流程的错误

    此外,捕获代码调用的代码上的异常也有效,因此它允许您更轻松地捕获代码中未生成的错误,并防止您必须知道内部代码如何工作,并且仍然能够处理问题,即异常

    这两者之间有许多不同之处:

    if my_path.is_file():
        with open(str(my_path)) as f:
            success()
    else:
        problem()
    
    这是:

    try:
        with open(str(my_path)) as f:
            success()
    except FileNotFoundError:
        problem()
    
    在第一种情况下,当您检查该文件是否存在时,它可能存在,但无法保证在您实际打开它时它仍然存在。为了完全安全,您仍然需要捕获该异常

    在这种情况下,这是不可能的,但是如果
    open()
    有复杂的行为,那么引发异常的原因可能不是
    .is\u file()
    捕获的

    如果您正在检查许多不同的有问题的结果,那么捕获相关的异常是一种相当干净的方法。如果您没有在这个级别处理特定的异常,一些调用您的代码的代码可能会在稍后的阶段处理它

    当然,这并不是说
    if
    语句永远都不是流控制的好结构,但在本例中,代码的成功取决于没有直接和完全控制的I/O,在这种情况下,异常几乎总是更好的选择(即使您也使用了
    if
    ,您也必须使用它们)


    有些人会指出异常的代价,但请注意,如果不引发异常,Python中的异常块是非常便宜的(并且您希望大多数情况下不会出现异常)-如果您希望尝试打开的大多数文件都不存在,这可能是首先检查的原因。

    使用异常与其说是“意外”错误,不如说是用于偏离正常执行流程的错误

    此外,捕获代码调用的代码上的异常也有效,因此它允许您更轻松地捕获代码中未生成的错误,并防止您必须知道内部代码如何工作,并且仍然能够处理问题,即异常

    这两者之间有许多不同之处:

    if my_path.is_file():
        with open(str(my_path)) as f:
            success()
    else:
        problem()
    
    这是:

    try:
        with open(str(my_path)) as f:
            success()
    except FileNotFoundError:
        problem()
    
    在第一种情况下,当您检查该文件是否存在时,它可能存在,但无法保证在您实际打开它时它仍然存在。为了完全安全,您仍然需要捕获该异常

    在这种情况下,这是不可能的,但是如果
    open()
    有复杂的行为,那么引发异常的原因可能不是
    .is\u file()
    捕获的

    如果您正在检查许多不同的有问题的结果,那么捕获相关的异常是一种相当干净的方法。如果您不在这个级别处理特定的异常,一些调用您的代码的代码可能会在稍后的阶段处理它

    当然,这并不是说
    if
    语句永远都不是流控制的好结构,但在本例中,代码的成功取决于没有直接和完全控制的I/O,在这种情况下,异常几乎总是更好的选择(即使您也使用了
    if
    ,您也必须使用它们)


    有些人会指出异常的代价,但请注意,如果不引发异常(而且大多数情况下,您可能不会想到),Python中的异常块非常便宜-如果您希望尝试打开的大多数文件都不存在,这可能是一个先检查的原因。

    请尝试尝试,但这些问题除外。 作为:-

    它将尝试try块,如果不能,它将转到except块并运行给定的东西。因此,它不会因为错误而停止运行代码

    你可以用

    except:
    

    要获取所有错误,它不会停止整个程序的运行。

    请尝试使用Try,但这些问题除外。 作为:-

    它将尝试try块,如果不能,它将转到except块并运行给定的东西。因此,它不会因为错误而停止运行代码

    你可以用

    except:
    

    要获取所有错误,它不会停止运行整个程序。

    如果完全错误,则使用
    。这会使您的程序易受竞争条件的影响,即使您自己准备了文件!要使您的问题得到正确回答,您可能需要给出此建议的来源。显然,只有在n你期待它们。很多“不要对X使用异常处理”是愚蠢的。在你的情况下,这正是你应该做的,以避免边缘情况,如文件在测试和使用之间消失。你无论如何都需要try/except来覆盖这个情况,那么为什么要