【发布时间】:2012-08-29 05:30:08
【问题描述】:
我不是在询问关于这种哲学的个人“宗教”意见,而是更多技术性的意见。
我知道这句话是测试您的代码是否“pythonic”的几个试金石之一。但对我来说,pythonic 意味着干净、简单和直观,没有加载用于糟糕编码的异常处理程序。
所以,实际的例子。我定义了一个类:
class foo(object):
bar = None
def __init__(self):
# a million lines of code
self.bar = "Spike is my favorite vampire."
# a million more lines of code
现在,来自程序背景,在另一个函数中我想这样做:
if foo.bar:
# do stuff
如果我不耐烦并且没有执行初始的 foo = None,我会得到一个属性异常。那么,“请求宽恕而不是许可”建议我应该这样做吗?
try:
if foo.bar:
# do stuff
except:
# this runs because my other code was sloppy?
为什么我最好在 try 块中添加额外的逻辑以便我可以让我的类定义更加模糊?为什么不先定义所有内容,然后明确授予权限?
(不要因为使用 try/except 块而责备我……我到处都在使用它们。我只是不认为用它们来捕获我自己的错误是正确的,因为我不是一个彻底的程序员。)
或者……我完全误解了“请求宽恕”的口头禅吗?
【问题讨论】:
-
您的声明“未加载错误编码的异常处理程序”是不合理的。好的代码具有所有必要的异常处理,但仅此而已。异常处理程序的存在几乎不意味着“糟糕的编码”。我认为如果可能的话,最好让应用程序处理问题(如果没有其他原因,只是优雅地关闭),而不是让它在用户的膝上毫不客气地崩溃:)
-
你不应该尝试添加异常处理程序来捕捉错误的编码,尤其是不是一个简单的
except:子句。你的单元测试应该能捕捉到这些问题,对于这种错误吐出回溯并杀死整个过程的异常并没有错。 -
请求宽恕的另一个好处是,当您处理无法控制的动态状态时,它有时可以避免权限根本无法解决的错误。我认为典型的例子是
os.path.exists,它只告诉你文件在某个时候存在或不存在。可能 90% 以上的if os.path.exists(filename): do_something_to(filename)使用在技术上存在问题。 -
@DSM 或只是
open()- 不要检查是否可以先打开文件(权限/存在等...) - 试试吧 :) [避免可能的竞争条件]
标签: python