G'day Stackoverflowers,
我是Perl的autodie pragma 的作者,它改变了Perl的内置函数,以便在失败时抛出异常.它类似于Fatal,但具有词法范围,可扩展的异常模型,更智能的返回检查以及更多更好的错误消息.它将Fatal
在未来的Perl版本(暂定5.10.1+)中替换该模块,但目前可以从CPAN for Perl 5.8.0及更高版本下载.
下一个版本autodie
将为flock
使用LOCK_NB
(非阻塞)选项的调用添加特殊处理.虽然失败的flock
调用通常会导致异常autodie
,但是如果返回的errno()是,则对flock
使用失败的调用LOCK_NB
将仅返回false .$!
EWOULDBLOCK
这样做的原因是人们可以继续编写如下代码:
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. }
在上面的代码中,由于其他人已将文件锁定为has(EWOULDBLOCK
)而失败的锁定不被视为硬错误,因此自动重放flock
仅返回false值.在我们正在使用不支持文件锁定的文件系统或网络文件系统并且网络刚刚死亡flock
的情况下,当自动发现我们的errno不是时,自动生成会产生适当的异常EWOULDBLOCK
.
这在Unix风格的系统上的开发版本中运行得很好,但它在Windows下失败了.看来,虽然Windows下的Perl支持该LOCK_NB
选项,但它没有定义EWOULDBLOCK
.相反,当发生阻塞时,返回的errno为33("域错误").
显然我可以将其硬编码为常量autodie
,但这不是我想要做的,因为这意味着如果错误发生变化(或已经改变),我就会被搞砸.我很乐意将它与Windows相当POSIX::EWOULDBLOCK
,但我不能为我的生活找到定义这样的东西的地方.如果你能提供帮助,请告诉我.
答案我特别不想要:
建议将其硬编码为常量(或更糟糕的是,留下一个神奇的数字浮动).
LOCK_NB
在Windows下根本不支持功能.
假设来自LOCK_NB
调用的任何失败都flock
应该返回false.
我在p5p或perlmonks上提出的建议.我已经知道了.
解释如何flock
,例外或Fatal
工作.我已经知道了.亲密.
tye.. 11
在Win32"native"Perl下,请注意$ ^ E在33处更具描述性,"进程无法访问该文件,因为另一个进程锁定了文件的一部分" ERROR_LOCK_VIOLATION
(可从Win32 :: WinError获得).
在Win32"native"Perl下,请注意$ ^ E在33处更具描述性,"进程无法访问该文件,因为另一个进程锁定了文件的一部分" ERROR_LOCK_VIOLATION
(可从Win32 :: WinError获得).
对于特定于Windows的错误代码,您要使用$^E
.在这种情况下,它是33:"进程无法访问该文件,因为另一个进程已锁定文件的一部分"(ERROR_LOCK_VIOLATION
in winerror.h
).
不幸的是,我不认为Win32 :: WinError是核心.另一方面,如果微软重新编写Windows错误代码,几乎所有编写的Windows程序都会停止工作,所以我认为硬编码不会有问题.