我对此try
/ except
声明有两个目标。
return
值为1,如果出现任何问题,则需要为0。我的return
值正常。我也有SystemExit()
工作。但是在一起,他们没有工作。
我的Python脚本(相关):
except IOError:
value_to_return = 0
return value_to_return
raise SystemExit("FOOBAR")
这样,它完全忽略raise SystemExit("FOOBAR")
行。我如何获得返回值仍然raise SystemExit("FOOBAR")
?这对某些人来说可能是基本的,但我实际上遇到了相当大的困难。
答案 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)
发生异常时,它可能具有关联的值,也称为 作为例外的论点。参数的存在和类型 取决于异常类型。
except子句可以在异常名称后指定一个变量。的 变量绑定到带有存储参数的异常实例 在instance.args中。为了方便起见,异常实例定义 str (),因此可以直接打印自变量,而不必引用.args。一个人也可以先实例化一个异常 提高它,并根据需要向其添加任何属性。
答案 5 :(得分:0)
我一直在不使用try的情况下寻找答案,请使用“ finally”这样的关键字..如果有人知道,请填写我 这是您的难题的答案
$ echo $foo
myCamelCaseValue
echo "${foo,}"
myCamelCaseValue
$ echo "${foo,,}"
mycamelcasevalue
$ echo "${foo^}"
MyCamelCaseValue
$ echo "${foo^^}"
MYCAMELCASEVALUE