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

kyr*_*nia 3 python python-3.x

有什么办法对付内异常if语句,比其他放一个try,except事先在每行支架周围一大堆,或者测试的例外呢?

例如,假设我有简化的代码:

 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") 
Run Code Online (Sandbox Code Playgroud)

如果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 exceptelif一行中包含子句?

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

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

use*_*450 5

好吧,有两种方法可以轻松处理这个问题.您可以对单个字符进行切片,如果该字符不存在,该字符将为空.例如,

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") 
Run Code Online (Sandbox Code Playgroud)

或者,您可以编写一个包装函数来忽略IndexErrors.例如,

def get(obj, index):
    try:
        return obj[index]
    except IndexError:
        return

if get(a, 0) == "a":
    return("foo")
elif get(a, 1) == "b":
    return("bar")
elif get(a, 5) == "d":
    return("bar2")
elif get(a, 2) == "c":
    return("bar3")
else:
    return("baz") 
Run Code Online (Sandbox Code Playgroud)