是否有可能在变量内引发异常?蟒蛇引发变量内的异常
做这种事情的最佳做法是什么?
side = side.lower() if side in 'left right'.split() else raise Exception(' wrong side!')
是否有可能在变量内引发异常?蟒蛇引发变量内的异常
做这种事情的最佳做法是什么?
side = side.lower() if side in 'left right'.split() else raise Exception(' wrong side!')
你不能,也不会有任何点。您不能将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!')
如何区分用户输入和程序值?
这就是我的意思是:
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"
所以LEFT
和RIGHT
可以是任何对不同的值,而这个代码更易于维护。
你也可以将可用于相同的程序价值更多的投入:
# including hebrew (left==smol, right==yemin)
valid_sides = {
"left": LEFT, "smol": LEFT, "right": RIGHT, "yemin": RIGHT
}
如果你真的想,你可以分配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
我不知道你是否应该这样做的,对我来说这很奇怪错误处理的方式。我宁愿为错误创建容器,以防万一沉默失败,并存储完整的回溯。
最好的做法是检查某些工作是否正常,并在发生故障时引发异常是将它们放入一个函数/方法中并在代码中使用它。像这样:
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))