Python:捕获异常在函数之外但不在函数内部

时间:2016-05-13 22:51:50

标签: python exception exception-handling

我有一个奇怪的问题,我无法自己解决。

如果我在两个单独的终端中执行outside_func.py,第二次执行会捕获BlockingIOError异常并打印消息:

outside_func.py

import fcntl
import time

# Raise BlockingIOError if same script is already running.
try:
    lockfile = open('lockfile', 'w')
    fcntl.flock(lockfile, fcntl.LOCK_EX | fcntl.LOCK_NB)
except BlockingIOError:
    print('Script already running.')

time.sleep(20)

如果我对inside_func.py执行相同操作,则不会捕获任何内容并且不会打印任何消息:

inside_func.py

import fcntl
import time

# Raise BlockingIOError if same script is already running.
def script_already_running():
    try:
        lockfile = open('lockfile', 'w')
        fcntl.flock(lockfile, fcntl.LOCK_EX | fcntl.LOCK_NB)
    except BlockingIOError:
        print('Script already running.')

script_already_running()

time.sleep(20)

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

当您离开该函数时文件被关闭,因此两个片段不相同,在代码片段中,try 在函数外部仍然存在对文件对象的引用睡眠调用的范围,所以进一步调用正确地打开 lockfile 错误。如果通过在函数内部移动睡眠来更改函数,您将看到引发的错误,因为现在您具有可比较的代码:

import fcntl
import time

# Raise BlockingIOError if same script is already running.
def script_already_running():
    try:
        lockfile = open('lockfile', 'w')
        fcntl.flock(lockfile, fcntl.LOCK_EX | fcntl.LOCK_NB)
    except BlockingIOError:
        print('except')
    sleep(20)