“或死()”在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 。

在PHP中使用die方法的主要用处是“脚本已经达到了一些僵局,无法从中恢复”。 如果有的话,很less用于生产代码。 你最好在被调用函数中引发一个exception,在父类中find一个exception,find一个优雅的退出点 – 这是两种语言的最佳方式。

Lot很好的答案,但是没有人提出用Python编写这个明显的方法:

 assert check_something(), "Incorrect data" 

只要知道,如果你打开优化,它不会做检查,而不是任何人做的。

虽然这种风格在PHP和Perl中很常见,但它非常不合Pythonic,我鼓励你不要这样写Python。 你应该遵循你使用的语言的惯例,并写下这样的内容:

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

FWIW,做“或死(…)”的方式增加了另一个层次到你的堆栈跟踪,这是另一个小缺点。

最大的缺点是所有的死亡现在都是一样的。 最好是让check_something()产生一个更准确的exception,然后在适当的时候把它们logging下来。

如果你正在处理一个你没有写的API,它会在失败时返回成功的真值和错误的值,这似乎是一个合理的可读和紧凑的方式来做到这一点。 如果你有对API的控制,我鼓励你使用exception而不是返回值来表示错误。

如果你使用这个函数,它可能不应该被称为die()除非它实际上退出程序。 如果仅仅是提出例外,那么这个计划实际上就不会死。 理想情况下,您可以将raise()作为raise语句的function版本来命名,但是当然,因为raise是一个保留字,所以不能这样做。 也许throw()

调用者传递一个exceptiontypes也是一个好主意,因为Exception是相当通用和模糊的。

对我来说,如果只有Pythonexception能够提升自己,那么这个函数是不必要的,也就是说,它有一个方法,就像这样:

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

那么你可以做:

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

可悲的是,Pythonexception无法自拔。 🙂

看起来你只是用python包装php的行话function。 我会build议反对,因为你可能会迷惑你的听众。 在PHP中,exception也是一个完全不同的野兽。