所以让我说我有这个python代码:
def loopForEachFileInDirectory(self, conn):
for filename in os.listdir(uploadedFilesDirectory):
try:
self.insertNewEntryForStagingFile(conn, filename)
self.copyFilesToStagingDirectory(filename)
except: ???
def copyFilesToStagingDirectory(self, filename):
logging.info("copying %s to youtube_ready",filename)
try:
shutil.copy(uploadedFilesDirectory+filename, stagingDirectory)
logging.info("move successful")
except shutil.Error,e:
logging.warn("move failed for reasons \n\t%d:%s", e.args[0],e.args[1])
raise ???
现在,“loopForEachFileInDirectory”方法将会有更多的方法 - 我在这里做了一些干净的编码(欢呼Robert Martin)。我想要的是从子方法中冒出任何异常,如果在主循环中发生任何事情,请在该循环上保释并继续。
问题是,冒泡一般异常的规则是什么?我只是自己筹集资金吗?如果是这样,我如何通常抛出一个异常,我如何捕获并记录一般异常的细节?
答案 0 :(得分:6)
冒泡通用异常的规则是什么?我只是自己筹集资金吗?
是。简短的回答是使用raise
。
如果是这样,我如何一般地抛出异常......
上面回答的其他提交者发布的内容是正确的,但它并没有提供太多的上下文。
Exception
是基类异常。 except Exception
适用于所有类型
Exception
因为所有Python异常都从此类继承。
except
语句可以指定指向异常对象的参数。
我不相信在这种情况下指定它是绝对必要的。实际上,使用默认值冒出异常可能就足够了:
except:
raise
没有任何实际需要指定异常类型或引用特定异常对象的变量e
。
..如何捕获并记录一般异常的详细信息?
logging.exception
是一个很好的方式。试试吧:
try:
<something that raises an error>
except Exception, e:
logging.exception(e)
答案 1 :(得分:3)
其他海报编写的简短Python 3扩展。在大多数情况下,裸raise
就足够了。它重新引发了原始异常,这是大多数情况下你想要做的事情。
但是有些情况下你想要引发一个新的异常 - 也许是为了向原始异常添加更多信息(比如正在处理的罪魁祸首对象的id)或者为了方便起见而将多个异常类型包装成一个呼叫者。
在这种情况下,raise ... from ...
(仅限Python 3,我害怕)构造非常有用,如:
try:
self.file = open(filename)
except IOError, exc:
raise DatabaseError('failed to open') from exc
from
子句的好处是它保留了原始异常的堆栈跟踪,如果你刚刚提出了一个全新的异常,它将会丢失。
在Python 2中正确地重新包装异常更加困难,Ian Bicking的博客文章很好地介绍了这个主题:http://blog.ianbicking.org/2007/09/12/re-raising-exceptions/
答案 2 :(得分:0)
#!/usr/bin/python
try:
print 'Youll see me first.'
try:
1[90]
except Exception,e:
print "************ UTOH!",str(e)
raise e
except Exception,e:
print ">>>>>>>>>>>> I concur, THE JIG IS UP!",str(e)
raise e