如何返回值并引发异常

时间:2014-01-21 00:24:35

标签: python exception exception-handling return systemexit

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

  1. 如果没有问题,则需要return值为1,如果出现任何问题,则需要为0。
  2. 需要引发异常并结束脚本。
  3. 我的return值正常。我也有SystemExit()工作。但是在一起,他们没有工作。

    我的Python脚本(相关):

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

    这样,它完全忽略raise SystemExit("FOOBAR")行。我如何获得返回值仍然raise SystemExit("FOOBAR")?这对某些人来说可能是基本的,但我实际上遇到了相当大的困难。

6 个答案:

答案 0 :(得分:7)

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

提升SystemExit将结束脚本。一些清理例程可以运行,如果调用者确实想要,他们可以捕获SystemExit并取消它,但大多数情况下,你可以把它想象为停止执行。调用者永远不会有机会看到返回值或使用它做任何有意义的事情。

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

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

答案 1 :(得分:1)

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

import sys
sys.exit(value_to_return)

答案 2 :(得分: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

答案 3 :(得分:0)

你不能提高"并且"返回"同时,如果出现错误,你必须在返回值中添加一个特殊变量(例如:in tuple)。

E.g: 我有一个函数(名为" 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 。使用时间模块(在上面的两个代码中),但我还没有导入它只是为了缩短它。如果你想真正尝试它,请在开头:

import time

答案 4 :(得分:0)

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

对您的问题的另一种蟒蛇般的答案可能是在加薪中使用错误参数,然后在调用中管理错误以获取值,将其从字符串转换为“ 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 docs

发生异常时,它可能具有关联的值,也称为 作为例外的论点。参数的存在和类型 取决于异常类型。

except子句可以在异常名称后指定一个变量。的 变量绑定到带有存储参数的异常实例 在instance.args中。为了方便起见,异常实例定义 str (),因此可以直接打印自变量,而不必引用.args。一个人也可以先实例化一个异常 提高它,并根据需要向其添加任何属性。

答案 5 :(得分:0)

我一直在不使用try的情况下寻找答案,请使用“ finally”这样的关键字..如果有人知道,请填写我 这是您的难题的答案

$ echo $foo
myCamelCaseValue
echo "${foo,}"
myCamelCaseValue
$ echo "${foo,,}"
mycamelcasevalue
$ echo "${foo^}"
MyCamelCaseValue
$ echo "${foo^^}"
MYCAMELCASEVALUE