我正在编写一个Perl模块,我正在使用鲤鱼向调用程序发出非致命警告.
鲤鱼警告工作正常 – 我正在检查输入参数是否满足特定条件 – 如果不符合条件,则会发出鲤鱼警告,模块继续使用参数的默认值,而不是调用程序通过.该警告只是通知正在使用默认参数,而不是传入的参数.
我的问题是我的测试脚本.我的测试脚本将错误的参数发送到模块,我正在尝试捕获回来的警告消息,并确保我收到了正确的警告消息.
我的模块看起来像这样:
else { carp "value must be numeric - using default value"; }
我的测试脚本如下所示:
eval { #call to my module }; like ( $@,qr/value must be numeric/,"Should abort on non-numeric value" );
当我运行测试时,我可以在屏幕上看到警告(它必须去STDERR),但$@变量的内容是” – 空白.
这是我测试脚本的输出:
t/04bad_method_calls....ok 10/12value must be numeric - using default value at ... # Failed test 'Should abort on non-numeric value' # at t/04bad_method_calls.t line 98. t/04bad_method_calls....NOK 12 # '' doesn't match '(?-xism:value must be numeric)' # Looks like you Failed 1 test of 12.
如果我将鲤鱼变成呱呱呱呱呱呱呱呱呱呱呱呱呱呱.,…….. – – – ……………….
说实话,我没有对eval的最好的了解 – 也许这不是捕捉鲤鱼警告输出的最佳方法.我尝试使用$SIG {WARN},但也是空的.
有没有办法捕捉鲤鱼的输出?这不是最大的事情,因为这只是我的测试脚本,但我仍然希望让我的测试脚本正常工作.
提前致谢!
解决方法
从这个页面,http://perldoc.perl.org/perlvar.html,看起来你想要将本地$SIG {__ WARN__}设置为一个子程序,这将会将警告转换为测试脚本的致命错误.他们给出的例子是:
local $SIG{__WARN__} = sub { die $_[0] }; eval $proggie;