有人在Python中使用这样的东西:
def die(error_message):
raise Exception(error_message)
...
check_something() or die('Incorrect data')
我认为这种风格在PHP和Perl中使用。
你在这个[风格]中找到任何(dis)优势吗?
答案 0 :(得分:69)
嗯,首先,sys.exit([arg])
更常见,如果你真的想要在PHP中等同于die
的东西,你应该使用它,引发SystemExit错误,或者调用{{ 3}}
PHP中die
方法的主要用途是,“脚本已达到一些僵局无法从中恢复”。很少(如果有的话)用于生产代码。你最好在被调用函数中引发异常,在父代中捕获它,并找到一个优雅的退出点 - 这是两种语言中最好的方法。
答案 1 :(得分:36)
很多很好的答案,但是没有人建议用Python写出这个明显的方法:
assert check_something(), "Incorrect data"
请注意,如果您启用优化,它将不会进行检查,而不是任何人都会这样做。
答案 2 :(得分:18)
虽然这种风格在PHP和Perl中很常见,但它非常不具有Pythonic,我建议你不要用这种方式编写Python。您应该遵循您正在使用的语言的约定,并写下这样的内容:
if not check_something():
raise Exception('Incorrect data')
FWIW,执行“或死(...)”方式会为堆栈跟踪添加另一个级别,这是另一个小缺点。
答案 3 :(得分:6)
最大的缺点是所有的死亡现在都是一样的。最好让check_something()
提出一个更准确的例外,然后在适当的情况下将其赶上来。
答案 4 :(得分:4)
如果你正在处理一个你没有编写的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异常无法提升自己。 : - )
答案 5 :(得分:3)
看起来你只是在python中使用一行函数包装php lingo。我会反对它,因为你可能会混淆你的观众。在PHP中,异常也是一种完全不同的野兽。