什么是优雅的/Pythonic的方法来保持变量在作用域中,同时捕获异常?

什么是优雅的/Pythonic的方法来保持变量在作用域中,同时捕获异常?,python,python-2.7,Python,Python 2.7,我已经使用Python几个月了,到目前为止我非常喜欢它。我还喜欢通常只有一种“Pythonic”方法来处理常见的编程问题 在我一直在编写的代码中,当我调用网络函数并处理异常时,我不断遇到我最终编写的各种模板: proxyTest = None try: proxyTest = isProxyWorking(proxy) except TimeoutError: break if proxyTest: ... 这是我声明proxyTest的方式,这样当我需要使用它时,它

我已经使用Python几个月了,到目前为止我非常喜欢它。我还喜欢通常只有一种“Pythonic”方法来处理常见的编程问题

在我一直在编写的代码中,当我调用网络函数并处理异常时,我不断遇到我最终编写的各种模板:

proxyTest = None
try:
    proxyTest = isProxyWorking(proxy)
except TimeoutError:
    break

if proxyTest:
    ...
这是我声明proxyTest的方式,这样当我需要使用它时,它就在范围内,同时也调用函数,该函数将在适当的异常处理结构中为它返回一个值。如果我在try块内声明proxyTest,它将超出程序其余部分的范围


我觉得必须有一个更优雅的方式来处理这个问题,但我不确定。有什么建议吗?

我会把代码放在后面

if proxyTest: 

在try块中,在绑定proxyTest之后。

明显的替代方法是在
块中执行“false”初始化,但
块除外:

try:
    proxyTest = isProxyWorking(proxy)
except TimeoutError:
    proxyTest = None
try:
    proxyTest = isProxyWorking(proxy)
except TimeoutError:
    break
else:
    #proxyTest is guaranteed to be bound here

这是否比您的构造更容易/更恰当取决于中间逻辑的复杂程度。

< p>您有几个更好的选项,继续在<代码>其他< /代码>块:

中的流控制。
try:
    proxyTest = isProxyWorking(proxy)
except TimeoutError:
    proxyTest = None
try:
    proxyTest = isProxyWorking(proxy)
except TimeoutError:
    break
else:
    #proxyTest is guaranteed to be bound here
或在except块中处理故障情况

try:
    proxyTest = isProxyWorking(proxy)
except TimeoutError:
    proxyTest = None
#proxyTest is guaranteed to be bound here

我认为,哪个更好取决于上下文

try套件内部的作用域与它外部的作用域相同。我不知道你的意思是什么:“如果我在try块内声明proxyTest,它将超出我程序其余部分的范围。”你能写一个简单的例子来说明你的问题,而不是你提出的解决方案的例子吗?它不会超出范围。它将在范围内,但未定义(使用时引发
UnboundLocalError
)。但这只是术语,并不影响问题。@mgilson如果
proxyTest=None
被遗漏,并且
isProxyWorking
引发
TimeoutError
,那么
如果proxyTest:
将引发
未绑定的本地错误
@delnan——或者
namererror
如果不在函数中。但这与作用域无关。一般来说,这有捕获太多(即吞咽代码其余部分中的错误)的危险。我不会——那么您可能会无意中捕获到其他地方确实不应该捕获的异常。@delnan--Jinx。你欠我一杯可乐。或者类似的;-)但他只捕捉到了时间错误,没有其他类型的例外。无论如何,看起来每个人都同意:-)所以我会研究这个。大的try块是一种代码味道
try
块通常应该只有一行,只要可能这是有意义的。我认为我误解了这样一个事实:在异常的情况下,proxyTest只是从未声明过(导致错误),而不是超出范围。这是正确的吗?对-正如@delnan在问题中所评论的,最终的结果是
proxyTest
从未定义过。但是try/except中定义的任何内容都与父代码在同一范围内。我喜欢这个答案。在我的例子中,我只是因为一个异常而误认为某些东西是未定义的。但是这些解决方案在程序流程的基础上给了我一些灵活性。谢谢