wfsp has asked for the wisdom of the Perl Monks concerning the following question:

Fixed. See note below.

I'm writing a test for a method that uses mkpath. I want the test to fail and I can trap the error ok but I'd also like to supress any output.

From the docs

If a system error prevents a directory from being created, then the mkpath function throws a fatal error with Carp::croak.
What's the best way of going about this?
#!/usr/bin/perl use strict; use warnings; use File::Path; my $path = q{a:/tmp}; # non existent drive eval {no warnings 'all'; mkpath $path}; if ($@){ print qq{failed\n}; } else{ print qq{ok\n}; }
produces
Argument "No such file or directory; The system cannot find the pa..." + isn't numeric in scalar assignment at c:/perl/lib/File/Path.pm line +152. failed
update: fixed typo
update 2
Fixed. I upgraded from mkpath 1.0901 to 2.04. Many thanks to Clinton and the crew in the CB.

Replies are listed 'Best First'.
Re: Fixed: Suppressing mkpath error output
by grinder (Bishop) on Feb 14, 2008 at 11:13 UTC

    Since 99.99% of the readers will not have been around at the time this was discussed in the CB (e.g. me), here's an example of how it could be done with File::Path version 2. The idea is to pass an error collector (a reference to a scalar) to mkpath, and instead of dying it will instead push all errors it encounters onto the collector.

    use strict; use File::Path 'mkpath'; use Data::Dumper; mkpath( 'a:/tmp', {error => \my $err}); @$err and print Dumper($err); __PRODUCES__ $VAR1 = [ { 'a:/' => 'Permission denied; The device is not ready' }, { 'a:/tmp' => 'Permission denied; The device is not ready' } ];

    The error variable is guaranteed to be always a reference to an array so that you don't have to add make-work code to ensure that it is defined, is a reference to an array, etc. etc. Just use it in scalar context to see if it contains zero elements (== no errors).

    • another intruder with the mooring in the heart of the Perl