我有函数,它查找特殊的Element (如果是项目文件):
def csproj_tag_finder(mod_proj_file):
"""Looking for 'BuildType' element in each module's csproj file passed in `mod_proj_file`
ard return it's value (CLOUD, MAIN, NGUI, NONE)"""
try:
tree = ET.ElementTree(file=mod_proj_file)
root = tree.getroot()
for element in root.iterfind('.//'):
if ('BuildType') in element.tag:
return element.text
except IOError as e:
# print 'WARNING: cant find file: %s' % e如果没有找到文件,它会打印'WARNING: cant find file: %s' % e。
这个函数是从另一个函数调用的:
def parser(modename, mod_proj_file):
...
# module's tag's from project file in <BuildType> elements, looks like CLOUD
mod_tag_from_csproj = csproj_tag_finder(mod_proj_file)
if not mod_tag_from_csproj:
print('WARNING: module %s have not <BuildType> elements in file %s!' % (modename, mod_proj_file))
...所以-当文件找不到时-csproj_tag_finder()返回None类型,并打印WARNING。第二个函数- parser()查找空的mod_tag_from_csproj变量,并打印WARNING。这是无害的,所以我想让csproj_tag_finder()引发特殊的Exception,所以parser()除了它并通过==检查,而不是打印文本。
我试着添加了这样的内容:
...
except IOError as e:
# print 'WARNING: cant find file: %s' % e
raise Exception('NoFile')到csproj_tag_finder(),以便稍后在parser()中捕获它--但是它会立即中断下一步。
P.S.稍后if not mod_tag_from_csproj:将调用另一个函数来添加新的Element。这个任务可以用return 'NoFile'来解决,然后用if/else来解决--但在我看来,raise在这里会更正确。还是不想?
发布于 2015-04-24 08:28:42
raise会立即中断接下来的步骤,这正是它应该做的。事实上,这就是例外的全部要点。
但是return也会立即中断接下来的步骤,因为早期返回也是return的全部要点。
如果希望将错误保存到以后,继续执行其他工作,然后在结束时引发错误,则必须显式地这样做。例如:
def spam():
error = None
try:
do_some_stuff()
except IOError as e:
print 'WARNING: cant find file %s' % e
error = Exception('NoFile')
try:
do_some_more_stuff()
except OtherError as e:
print 'WARNING: cant frob the glotz %s' % e
error = Exception('NoGlotz')
# etc.
if error:
raise error现在,只要没有您忘记处理的意外异常,error中的任何最后失败的异常都将在最后被引发。
另外,您可能希望创建一个Exception('NoFile')子类,而不是引发==,然后使用==测试异常字符串;然后不需要测试它,您只需使用except NoFileException:来处理它。这意味着您可以携带其他一些有用的信息(实际异常、文件名等)。在你的例外情况下,它也不会妨碍你。如果这听起来很吓人的话,那就不是了。这实际上是一条单线线:
class NoFileException(Exception): passhttps://stackoverflow.com/questions/29842236
复制相似问题