11

try我对这个/except声明有两个目标。

  1. 如果没有出现问题,则需要return值为 1,如果出现任何问题,则需要值为 0。
  2. 它需要引发异常并结束脚本。

我有return工作的价值。我也有SystemExit()工作。但是在一起,他们没有工作。

我的 Python 脚本(相关):

except IOError:
    value_to_return = 0
    return value_to_return
    raise SystemExit("FOOBAR")

有了这个,它raise SystemExit("FOOBAR")完全忽略了这条线。我如何去获得一个返回值并且仍然raise SystemExit("FOOBAR")?这对某些人来说可能是基本的,但我实际上遇到了很多困难。

4

6 回答 6

13

回归和提升是相互排斥的。

加注SystemExit将结束脚本。一些清理例程开始运行,如果调用者真的非常想要,他们可以捕获SystemExit并取消它,但大多数情况下,您可以将其视为在此处停止执行。调用者永远不会有机会看到返回值或用它做任何有意义的事情。

返回意味着您希望脚本继续。继续可能意味着让调用者 raise SystemExit,或者可能意味着忽略错误,或者可能意味着其他东西。无论它意味着什么,都取决于您,因为您是编写代码的人。

最后,你确定你应该处理这个错误吗?仅捕获异常以将其转换为系统关闭可能不是最有用的行为。这不是一种处理问题的用户友好方式,它隐藏了您从堆栈跟踪中获得的所有有用的调试信息。

于 2014-01-21T00:33:21.893 回答
3

您可以在调用后使用“returning_value”参数引发错误。

您的问题的另一个 Pythonic 答案可能是使用 raise 中的错误参数,然后在您的调用中管理错误以获取值,将其从字符串转换并获取您的“return-ish”。

def your_f():
    try:
      some_io_thingy_ok()
      return 1
    except IOError:
        raise SystemExit("FOOBAR", 0)

try:
    my_returning_value = your_f()
except SystemExit as err:
    my_returning_value = err.args[1]


print(my_returning_value)

来自Python 3 文档

当异常发生时,它可能有一个关联的值,也称为异常的参数。参数的存在和类型取决于异常类型。

except 子句可以在异常名称之后指定一个变量。该变量绑定到一个异常实例,其参数存储在 instance.args 中。为方便起见,异常实例定义了 str (),因此可以直接打印参数,而无需引用 .args。也可以在引发异常之前先实例化异常,然后根据需要向其添加任何属性。

于 2020-08-15T18:12:29.593 回答
2

要退出脚本并返回退出状态,请使用sys.exit()

import sys
sys.exit(value_to_return)
于 2014-01-21T00:41:40.657 回答
0

我认为您可能正在寻找的是更像这样的东西:

def some_function():
    # this function should probably do some stuff, then return 1 if
    # it was successful or 0 otherwise.
    pass

def calling_function():
    a = some_function()
    if a == 1:
        raise SystemExit('Get the heck outta here!')
    else:
        # Everything worked!
        pass
于 2014-01-21T00:33:11.010 回答
0

你不能同时“raise”和“return”,所以你必须在返回值中添加一个特殊的变量(例如:在元组中)以防出错。

例如:我有一个函数(名为“func”),它计算一些东西,即使在计算过程中发生异常,我也需要(部分)结果。在我的示例中,我将使用 KeyboardInterrupt 异常(用户按下 CTRL-C)。

在函数中没有异常处理(这是错误的,如果出现任何异常,函数不会返回任何东西):

def func():
    s=0
    for i in range(10):
        s=s+1
        time.sleep(0.1)
    return s


x=0
try:
    for i in range(10):
       s=func()
       x=x+s
except KeyboardInterrupt:
    print(x)
else:
    print(x)

现在我引入一个布尔返回值(在元组中,在原始返回值旁边)来指示是否发生了异常。因为在函数中我只处理 KeyboardInterrupt 异常,我可以确定这已经发生了,所以我可以在调用函数的地方提出同样的问题:

def func():
    try:
        s=0
        for i in range(10):
            s=s+1
            time.sleep(0.1)
    except KeyboardInterrupt: # <- the trick is here
        return s, True        # <- the trick is here
    return s, False           # <- the trick is here


x=0
try:
    for i in range(10):
        s,e=func()
        x=x+s
        if e:                         # <- and here
            raise KeyboardInterrupt   # <- and here
except KeyboardInterrupt:
    print(x)
else:
    print(x)

注意:我的例子是python3。使用了 time 模块(在上面的两个代码中),但我没有导入它只是为了让它更短。如果您想真正尝试一下,请放在开头:

import time
于 2018-06-06T13:22:57.590 回答
0

我在不使用尝试的情况下寻找答案,像这样使用'finally'关键字..如果有人知道,请填写我这里是您问题的答案

try:
    9/0#sample error "don't know how to make IOError"
except ZeroDivisionError:
    value_to_return = 0
    raise SystemExit("FOOBAR")
finally:return value_to_return
于 2020-09-18T09:06:28.230 回答