Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何返回值并引发异常_Python_Exception_Exception Handling_Return_Systemexit - Fatal编程技术网

Python 如何返回值并引发异常

Python 如何返回值并引发异常,python,exception,exception-handling,return,systemexit,Python,Exception,Exception Handling,Return,Systemexit,除了声明之外,我有两个目标 如果没有出现问题,则需要返回值1,如果出现任何问题,则返回值0 它需要引发异常并结束脚本 我让返回值工作。我还让SystemExit()工作。但在一起,它们是不起作用的 我的Python脚本(相关): except IOError: value_to_return = 0 return value_to_return raise SystemExit("FOOBAR") 这样,它将完全忽略raisesystemexit(“FOOBAR”)行。

除了声明之外,我有两个目标

  • 如果没有出现问题,则需要
    返回值1,如果出现任何问题,则返回值0
  • 它需要引发异常并结束脚本
  • 我让
    返回值
    工作。我还让
    SystemExit()
    工作。但在一起,它们是不起作用的

    我的Python脚本(相关):

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

    这样,它将完全忽略
    raisesystemexit(“FOOBAR”)
    行。如何获取返回值并仍然
    引发SystemExit(“FOOBAR”)
    ?这对某些人来说可能是基本的,但实际上我在这方面有相当大的困难。

    我想你可能在寻找更像这样的东西:

    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
    

    返回和提升是相互排斥的

    提升
    SystemExit
    将结束脚本。一些清理例程开始运行,如果调用方真的、真的想运行,它们可以捕获
    SystemExit
    并取消它,但大多数情况下,您可以将其视为立即停止执行。调用者将永远没有机会看到返回值或对其执行任何有意义的操作

    返回意味着您希望脚本继续。继续可能意味着调用者引发
    SystemExit
    ,或者意味着忽略错误,或者意味着其他事情。这意味着什么取决于你,因为你是编写代码的人


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

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

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

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

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

    现在我引入一个布尔返回值(在元组中,在原始返回值旁边)来指示是否发生异常。因为在函数中,我只处理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)
    

    您可以在调用后使用“returning\u value”参数引发错误。

    问题的另一个pythonic答案可能是利用raise中的error参数,然后在您的调用中管理错误以获取值,将其从string转换并获取“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。也可以先实例化一个异常,然后再初始化 提升它并根据需要向其添加任何属性


    我在寻找答案时没有使用try,而是使用像这样的“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
    

    如果您引发SystemExit并实际希望脚本结束,那么返回值应该放在哪里(脚本毕竟结束了)?或者您想先捕获异常,返回,执行一些错误处理,然后稍后退出吗?如果返回,则不会发生加薪。无论如何,你不能两者都做!选择您想要什么,退出还是返回。只是猜测一下,但您可能需要返回0并让调用者引发
    SystemExit
    。无法在同一个函数中同时执行这两个操作。是否要将状态代码返回到shell?我与首席工程师进行了仔细检查。他希望我的脚本返回一个0,因为出现了问题,脚本应该结束,因为从那时起它就变得无用了。所以我确实需要返回一个0并结束脚本。我尝试了下面所有的答案,没有一个有效。@Ingyher:没有,那个教程部分太差劲了。IIRC有人从Github评论中复制了一个写得很差的描述,但没有仔细检查
    finally
    将暂停异常的传播,然后
    return
    将取消异常并返回
    “value”
    。具有更准确的描述,特别是“如果finally子句执行return或break语句,则丢弃保存的异常”。语言参考往往比教程更好(但语言参考也不是完美的;例如,它经常没有提到如何通过神奇的方法自定义各种操作)。好的,@user2357112supportsMonica。我运行了一个示例程序,你确实是对的。不幸的是,本文一字不差地指出,“如果exception子句没有处理异常,那么在finally子句执行后,将重新引发异常。”它还讨论了一个示例,其中finally被执行,然后异常被处理。不过,这并不一定与你所写的相矛盾。不幸的是,在其他SO职位上存在矛盾。为了清楚起见,删除了之前的评论。你不能同时使用
    \uuuu内置项\uuuuuuuuu.exit(value\u to\u return)
    吗?@UltimateScreer是的,看起来是这样<代码>系统退出
    显然是程序中的首选,请参阅
    import time
    
    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)
    
    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