你们好,Stackoverflowers:
我是Perl的autodie预处理器的作者,它可以修改Perl内置函数以便在出错时抛出异常。它类似于Fatal,但具有词法作用域、可扩展的异常模型、更智能的返回检查和更友好的错误消息。它将取代未来版本的Perl(暂定为5.10.1+)中的Fatal
模块,但目前可以从CPAN下载,并且兼容Perl 5.8.0及以上版本。
autodie
的下一个版本将为使用LOCK_NB
(非阻塞)选项调用flock
添加特殊处理。虽然在autodie
下失败的flock
调用通常会导致异常,但使用LOCK_NB
失败的flock
调用将仅在返回的errno($!
)为EWOULDBLOCK
时仅返回false。
这样做的原因是为了让人们可以继续编写像下面这样的代码:
use Fcntl qw(:flock);
use autodie; # All perl built-ins now succeed or die.
open(my $fh, '<', 'some_file.txt');
my $lock = flock($fh, LOCK_EX | LOCK_NB); # Lock the file if we can.
if ($lock) {
# Opportuntistically do something with the locked file.
}
在上面的代码中,因为其他人已经锁定了文件而导致失败的锁(
EWOULDBLOCK
)不被认为是硬错误,因此自动死锁的flock
仅返回false值。 在我们使用不支持文件锁或网络文件系统并且网络刚刚断开的文件系统时,autodying flock
会生成适当的异常,因为它看到我们的errno不是EWOULDBLOCK
。这在我的Unix版本的开发系统上完全正常,但在Windows下却失败了。似乎在Windows下,虽然Perl支持
LOCK_NB
选项,但它没有定义EWOULDBLOCK
。 相反,当阻塞发生时返回的errno为33(“域错误”)。显然,我可以将其硬编码为
autodie
中的常量,但这不是我想在这里做的事情,因为这意味着如果errno发生变化(或已更改),我就无法解决。 我很想将其与POSIX :: EWOULDBLOCK
的Windows等效项进行比较,但我无论如何都找不到定义这种东西的地方。 如果您能帮忙,请告诉我。我明确不想要的答案:
- 将其硬编码为常量(更糟糕的是,让一个魔数漂浮着)的建议。
- 在Windows下根本不支持
LOCK_NB
功能。 - 假设从
flock
的LOCK_NB
调用失败只应该返回false。 - 建议我在p5p或perlmonks上询问。我已经知道它们了。
flock
,或异常,或Fatal
如何工作的说明。我已经很熟悉了。