在Python中处理if语句中的异常

时间:2016-01-16 01:22:54

标签: python python-3.x

除了在整个批次中放置tryexcept括号,还是预先在每行上测试异常之外,有没有办法处理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") 

如果aword_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条款?

(显然,有可能没有办法,因此得到确认,加入例外的预测试是如何进行将是很好的知道)。

(我应该注意,我的代码比上面的代码要复杂得多,虽然我可以进行预检,但是会有相当多的代码,所以只是试着看看是否有更简单的代码溶液。)

2 个答案:

答案 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)