我有函数,如果是项目文件,它会查找特殊的container-element
:
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
。这是无害的,所以我希望make WARNING
引发特殊csproj_tag_finder()
,所以除了它Exception
并通过parser()
检查,而不是打印文本。
我尝试添加类似的内容:
==
到 ...
except IOError as e:
# print 'WARNING: cant find file: %s' % e
raise Exception('NoFile')
稍后在csproj_tag_finder()
中抓住它 - 但它会立即中断后续步骤。
P.S。稍后parser()
将调用另一个函数来添加新的if not mod_tag_from_csproj:
。只需Element
即可解决此任务,然后使用return 'NoFile'
进行搜索 - 但在我看来if/else
将更加正确。或者不是?
答案 0 :(得分:1)
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')
,而是稍后使用==
来测试异常字符串,您可能想要创建一个NoFileException
子类;然后你不需要测试它,你可以用except NoFileException:
来处理它。这意味着您可以在异常中携带一些其他有用的信息(实际异常,文件名等),而不会妨碍它。如果这听起来很可怕,那就不是了。它实际上是一个单行:
class NoFileException(Exception): pass