"or die()" 在 Python 中

  • 本文关键字:Python or die python
  • 更新时间 :
  • 英文 :


有人在Python中使用这样的东西吗?

def die(error_message):
    raise Exception(error_message)
...
check_something() or die('Incorrect data')

我认为这种风格在PHP和Perl中使用。

你觉得这种款式有什么(缺点)优点吗?

首先,sys.exit([arg])更常见,如果你真的想在PHP中使用等同于die的东西,你应该使用它,引发SystemExit错误,或者调用os._exit.

die方法在PHP中的主要用途是,"脚本已达到某种僵局,无法从中恢复"。它很少(如果有的话)用于生产代码。您最好在被调用的函数中引发异常,在父函数中捕获异常,并找到合适的退出点——这是两种语言中最好的方法。

有很多好的答案,但还没有人提出用Python编写这个问题的明显方法:

assert check_something(), "Incorrect data"

只是要注意,它不会做检查,如果你打开优化,没有人做过。

虽然这种风格在PHP和Perl中很常见,但它非常不符合Python,我建议您不要这样编写Python。您应该遵循所使用语言的约定,并编写如下内容:

if not check_something():
    raise Exception('Incorrect data')

使用"or die(…)"的方式增加了堆栈跟踪的另一个级别,这是另一个小缺点。

最大的缺点是现在所有的死亡都是一样的。最好让check_something()引发一个更准确的异常,然后在合适的情况下赶上上面的异常。

如果您正在处理一个不是您编写的API,它在成功时返回真值,在失败时返回假值,那么这似乎是一种合理的可读和紧凑的方法。如果您可以控制API,我建议您使用异常而不是返回值来指示错误。

如果你使用这个函数,它可能不应该被称为die(),除非它真的退出了程序。如果它只是引发一个异常,并不能保证程序真的会死亡。理想情况下,您可以将其命名为raise(),作为raise语句的功能版本,但当然不能这样做,因为raise是保留字。也许是throw()

要求调用者传递异常类型也是一个好主意,因为Exception是相当通用和模糊的。

我突然想到,如果只有Python异常能够引发自己,也就是说,它们有一个方法来处理它,那么这个函数就没有必要了,像这样:

class BaseException(object):
     def throw(self):
         raise self

那么你可以这样写:

check_something() or Exception("check failed").throw()

遗憾的是,Python异常不能引发自己。: -)

理想情况下,您希望使用有用的堆栈跟踪来die/panic,以便您可以轻松地定位问题。因此,与最流行的答案不同,您应该AVOID sys.exit()或引发SystemExit,因为它们将导致您的程序静默地死亡(没有有用的跟踪)。

你应该使用像RuntimeError这样的一般异常,它很可能以后不会被处理/捕获,它会创建一个漂亮的堆栈跟踪:

def die(message):
    raise RuntimeError(message)

print("hello world")
die('A helpful message')
print("hello world again")

我们得到以下有用的堆栈跟踪:

hello world
Traceback (most recent call last):
  File "/test.py", line 9, in <module>
    die("A helpful message")
  File "/test.py", line 5, in die
    raise RuntimeError(message)
RuntimeError: A helpful message

如果我使用sys.exit代替,我将得到以下可怜的输出:

import sys
def die(message):
    sys.exit(message) # internally raises SystemExit
print("hello world")
die("A helpful message")
print("hello world again")
hello world
A helpful message

看起来您只是用一行函数将php术语包装在python中。我建议不要这样做,因为你可能会让你的听众感到困惑。在PHP中,异常和死亡是完全不同的。

最新更新