2015-03-02 85 views
0

是否有可能在变量内引发异常?蟒蛇引发变量内的异常

做这种事情的最佳做法是什么?

side = side.lower() if side in 'left right'.split() else raise Exception(' wrong side!') 

回答

2

你不能,也不会有任何。您不能将raise的结果分配给一个变量。

既然你提出了一个异常和变量都不会被绑定反正,你应该只使用一个if语句引发异常,然后分配:

if side.lower() not in ('left', 'right'): 
    raise Exception('wrong side!') 
side = side.lower() 

如果side是一个局部变量,都不会有问题,如果你分配给它与否,反正提出将退出范围之外,所以你也可以扭转语句来避免调用str.lower()两次:

side = side.lower() 
if side not in ('left', 'right'): 
    raise Exception('wrong side!') 
0

如何区分用户输入和程序值?

这就是我的意思是:

LEFT, RIGHT = -1, 1 # they can be any two values 

valid_sides = {"left": LEFT, "right": RIGHT} 

side = valid_sides[side.lower()] 

这将提高对无效输入脱钩输入一个异常从程序价值。

如果你可以用字符串自己好,没问题:

LEFT, RIGHT = "left", "right" 

所以LEFTRIGHT可以是任何对不同的值,而这个代码更易于维护。

你也可以将可用于相同的程序价值更多的投入:

# including hebrew (left==smol, right==yemin) 
valid_sides = { 
    "left": LEFT, "smol": LEFT, "right": RIGHT, "yemin": RIGHT 
} 
0

如果你真的想,你可以分配Exception一个变量,但是这不涨价。如果你正在做一些全局的异常处理,这可能是有意义的,但我无法想象你将如何使用它。 例如你可以做类似如下:

side = side.lower() if side in 'left right'.split() else ValueException(' wrong side!') 
#in other place that uses side 
if isinstance(side, Exception): 
    #silent fail 
else: 
    #do something useful here 

,但在其他地方,不能只是默默的失败:

if isinstance(side, Exception): 
    raise side 

我不知道你是否应该这样做的,对我来说这很奇怪错误处理的方式。我宁愿为错误创建容器,以防万一沉默失败,并存储完整的回溯。

0

最好的做法是检查某些工作是否正常,并在发生故障时引发异常是将它们放入一个函数/方法中并在代码中使用它。像这样:

def validate_side(direction): 
    if direction in ('left', 'right'): 
     return direction.lower() 
    else: 
     raise Exception('Wrong side!!') 

然后为您的变量调用validate_side。你想在一个变量中出现异常的原因是你不希望某些东西破坏流程,最后你最终清理出现异常的东西,然后你可以通过吞吐异常来实现。

def validate_side(direction): 
    if direction in ('left', 'right'): 
     return direction.lower() 
    else: 
     return None # Note that this else part is not needed as the function will return None in case the if fails; just for readability 

a = ['left', 'right', 'up', 'side', 'left'] 
b = [] 
for side in a: 
    b. append(validate_side(side)) 
b = filter(None, b) # Removes the empty values 

对于一个内胆,

a = ['left', 'right', 'up', 'side', 'left'] 
b = map(side.lower, filter(validate_side, a)) 
# This even though small, I would not recommend it; 
# Not because it is bad practice; just that bad readability in my opinion 

或者,如果你一定要到位两面,不可离开或写,因为它是需求,你不能做任何的异常,可以返回(validate_side)中的异常对象并将其保存用于任何目的(我无法想到用例)

def validate_side(direction): 
    if direction in ('left', 'right'): 
     return direction.lower() 
    else: 
     return Exception('Wrong side %s is given' % (direction))