除了在整个批次中放置try
,except
括号,还是预先在每行上测试异常之外,有没有办法处理if语句中的异常?
例如,假设我有简化的代码:
if a[0] == "a":
return("foo")
elif a[1] == "b":
return("bar")
elif a[5] == "d":
return("bar2")
elif a[2] == "c":
return("bar3")
else:
return("baz")
如果a
为word_of_six_characters_or_more
,这样可以正常工作。如果它是一个较短的单词,则会在行elif a[5] == "d"
上引发异常。显然,可以提前测试异常(例如,将elif a[5] == "d"
更改为elif len(a) >5 and a[5] =="d"
,然后依赖于第一部分为False
,因此第二部分从未执行过。我的问题是,是否有任何其他方法可以将exceptions
视为False
并继续执行下一个elif
语句而不是抛出异常 - 或类似地,包括try
行内的except
elif
条款?
(显然,有可能没有办法,因此得到确认,加入例外的预测试是如何进行将是很好的知道)。
(我应该注意,我的代码比上面的代码要复杂得多,虽然我可以进行预检,但是会有相当多的代码,所以只是试着看看是否有更简单的代码溶液。)
答案 0 :(得分:5)
嗯,有两种方法可以轻松应对。您可以对单个字符进行切片,如果该字符不存在,该字符将为空。如,
$img = ( $mode == 'top' ) ? get_the_post_thumbnail( null, 'large' ) : get_the_post_thumbnail( null, 'medium' );
// Add this line....(gets the markup you requested, and custom field value)
$custom_field = '<i class="cat_tag">' . the_field('parent_category') . '</i>';
// And modify this line.... (inserts it into the returned string)
$the_image = sprintf( '<span class="c_img">%s%s</span>', $custom_field, $img );
$thumb_link = sprintf( '<a class="%s" href="%s" rel="bookmark" title="%s %s" style="%s">%s</a>', $classes, get_permalink( $post ), __( 'Link To', 'pagelines' ), the_title_attribute( array( 'echo' => false ) ), $style, $the_image );
$output = ( 'top' == $mode ) ? sprintf( '<div class="full_img fix">%s</div>', $custom_field, $thumb_link ) : $thumb_link;
return apply_filters( 'pagelines_thumb_markup', $output, $mode, $format );
或者,您可以编写一个包装函数来忽略if a[0:1] == "a":
return("foo")
elif a[1:2] == "b":
return("bar")
elif a[5:6] == "d":
return("bar2")
elif a[2:3] == "c":
return("bar3")
else:
return("baz")
。如,
IndexError
答案 1 :(得分:0)
没有办法将任何引发的异常视为False
。您可以进行一系列预检查以防止异常(如您所提到的),或编写捕获异常并返回False
的函数(如提及的@cpburnz)。
根据复杂性,您可能最好定义可以按顺序迭代的规则,然后使用匹配的第一个规则来确定操作。
例如:
def checkA(val):
try:
# check val
return ...
except Exception:
return False
def doA(val):
# act on the value
return ...
conditions = (
{ 'check': checkA, 'action': doA },
{ 'check': checkB, 'action': doB },
...
)
for con in conditions:
if con['check'](a):
return con['action'](a)