我发现当我不需要使用时,我已经被这个问题搞糊涂了try..except
.过去几天它几乎用在我定义的每个函数中,我认为这可能是一个不好的做法.例如:
class mongodb(object): def getRecords(self,tname,conditions=''): try: col = eval("self.db.%s" %tname) recs = col.find(condition) return recs except Exception,e: #here make some error log with e.message
我的想法是,到处可以提出异常,我必须用它try
来获取它们.我的问题是,在定义函数时到处使用它是一个好习惯吗?如果不是有任何原则吗?帮助将不胜感激!
问候
这(非常广泛地捕捉所有可能的例外)确实被认为是不好的做法.你将掩盖异常的真正原因.
仅捕获' 明确命名 '的异常类型(您希望发生这种异常,并且您可以/将优雅地处理).让其他人(意想不到的人)按照他们应该的方式冒泡.
您可以通过覆盖来记录这些(未捕获的)异常(全局)sys.excepthook
:
import sys import traceback # ... def my_uncaught_exception_hook(exc_type, exc_value, exc_traceback): msg_exc = "".join( \ traceback.format_exception(exc_type, exc_value, exc_traceback) ) # ... log here... sys.excepthook = my_uncaught_exception_hook # our uncaught exception hook
这可能不是最好的事情.异常的全部意义在于,您可以将它们捕获到与其引发的不同的级别上.最好在有足够信息的地方处理它们,以便对它们有用(这非常依赖于应用程序和上下文).
例如,下面的代码可以抛出IOError("[Errno 2]没有这样的文件或目录"):
def read_data(filename): return open(filename).read()
在该函数中,您没有足够的信息来处理它,但是在实际使用此函数的地方,如果出现此类异常,您可能会决定尝试使用不同的文件名或向用户显示错误,或者其他内容:
try: data = read_data('data-file.txt') except IOError: data = read_data('another-data-file.txt') # or show_error_message("Data file was not found.") # or something else