繁体   English   中英

python在变量内引发异常

[英]python raise exception inside a variable

是否可以在变量内引发异常?

做这样的事情的最佳实践是什么?

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()退出作用域,因此您也可以反转语句以避免两次调用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"

因此LEFTRIGHT可以是任何一对不同的值,并且此代码更易于维护。

您还可以为相同的程序内值提供更多输入:

# 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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM