try 块中变量的命名空间范围
namespace scope for variables inside try block
关于这两个选项:
try:
userid = get_userid()
except:
userid = ""
对比
userid = ""
try:
userid = get_userid()
except:
pass
有什么区别吗,特别想知道如果 userid
仅在 try
块中设置,命名空间将如何工作?它们是否具有相同的命名空间范围?
一个比另一个更受欢迎吗?
您可以使用locals()
查看每种情况下定义的变量。没有区别。
像 try
和 except
这样的块(还有 if
、elif
、else
、with
)没有 "local scope".但是,您不能也不应该期望 try
块中的任何代码都会被执行(因为它可能会失败并直接进入 except
或 finally
块)。
但是你确定 ""
as "failing" user_id
有意义吗?为什么不是别的东西,例如 None
?
另外你应该避免捕获所有异常,所以我更喜欢这样的东西:
try:
userid = get_userid()
except Exception: # or a more specific exception
userid = None
执行您给出的两个语句后的结果状态没有区别。
如果省略第二个userid=""
,如果出现错误,变量将返回undefined。
应该首选第一个语句,因为它 (a) 更好并且 (b) 更快(如果没有错误发生,userid
会获得两次赋值)。
关于这两个选项:
try:
userid = get_userid()
except:
userid = ""
对比
userid = ""
try:
userid = get_userid()
except:
pass
有什么区别吗,特别想知道如果 userid
仅在 try
块中设置,命名空间将如何工作?它们是否具有相同的命名空间范围?
一个比另一个更受欢迎吗?
您可以使用locals()
查看每种情况下定义的变量。没有区别。
像 try
和 except
这样的块(还有 if
、elif
、else
、with
)没有 "local scope".但是,您不能也不应该期望 try
块中的任何代码都会被执行(因为它可能会失败并直接进入 except
或 finally
块)。
但是你确定 ""
as "failing" user_id
有意义吗?为什么不是别的东西,例如 None
?
另外你应该避免捕获所有异常,所以我更喜欢这样的东西:
try:
userid = get_userid()
except Exception: # or a more specific exception
userid = None
执行您给出的两个语句后的结果状态没有区别。
如果省略第二个userid=""
,如果出现错误,变量将返回undefined。
应该首选第一个语句,因为它 (a) 更好并且 (b) 更快(如果没有错误发生,userid
会获得两次赋值)。