有人在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')
最大的缺点是现在所有的死亡都是一样的。最好让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中,异常和死亡是完全不同的。