【问题标题】:raising an error in try/except/finally model code在 try/except/finally 模型代码中引发错误
【发布时间】:2018-12-05 22:09:04
【问题描述】:

我正在编写一个使用文件的代码。 我想检查文件名是否为空字符串,如果是则引发 ValueError。此外,无论如何我都想关闭所有文件

  1. 我可以在代码的“try”块之前引发 ValueError 吗?
  2. 只用“try”和“finally”写代码可以吗?

    `def 函数(file_1,file_2):

    if file_1 == '' or file_2 == '':
            raise ValueError("Invalid input")
    try:
       ~rest of the code~
    
    finally:
       if file_1 =! None or file_2 != None:
         file_1.close()
         file_2.close()`
    

【问题讨论】:

标签: python try-catch


【解决方案1】:

Python 有一个叫做“上下文管理器”的东西,它可以帮助你做你想做的事情。

def function(file_1, file_2):
    if file_1 == '' or file_2 == '':
        raise ValueError("Invalid input")

    with open(file_1) as f1, open(file_2) as f2:
        ... # here goes the code that handles the files

文件将在with 块的开头打开,并在退出块时适当关闭。

我可以在代码的“try”块之前引发 ValueError 吗?

是的,你可以。但是,如果没有except 块可以捕获它,它将中止程序的执行。

只用“try”和“finally”写代码可以吗?

是的,你可以。但正如我上面所描述的,为此使用上下文管理器更正确。

【讨论】:

    【解决方案2】:
    1. 可以,但是会引发异常并且代码会停止。
    2. 您可以这样做,但如果尝试部分有错误,如果您没有except:,代码将停止。但是它会在停止前执行finally: 部分。

    【讨论】:

    • 1.很好,这就是我想要的。那么在 try 块中或之前提出这个有什么区别吗?
    • 如果在 try 块中引发异常,finally: 部分中的代码将被执行。否则不会。
    • 不确定我是否理解。如果我在尝试之前写了它,那是否意味着它不会进入finally部分?
    • 是的,就像任何其他异常一样,它会停止代码。如果要运行finally 部分,则必须在try 部分中引发异常。 (这就是try 的作用:如果引发异常,则执行特定的操作。)
    • @Alex Pluig 我现在看到了。在我的代码中,我打开了try 部分中的文件,因此如果字符串为空,它无论如何都不会打开它们(我在try 部分之前检查过它),所以我猜它是否无关紧要到达finally 部分
    猜你喜欢
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多