in reply to <rant>CPAN modules failing to check for write errors</rant>

Wow, you sure picked the wrong way to try to fix this problem. This 'fix as many places where writing is done in as many CPAN modules as we can' idea is just plain untenable.

Meanwhile, you can rather simply fix the problem. Extend Fatal to support universally overriding print / syswrite / printf / etc. such that failures are reported. For best results, support treating failures in a void context (which some might wish to be fatal) different from other failures (these might be better to log / warn about but let the calling code deal with the failure).

If something like that is available, then I'd use it in my modules to override my module's write operations such that failures are reported. Without such, I'll continue to not check the results of write operations but to warn of close failures.

Just to be clear, if you write this, then you can fix your production scripts with it without having to modify any of the modules that get used. I would use it in my modules so that people who don't bother to do this would still benefit from write failures being detected.

(updated)

- tye        

  • Comment on Re: CPAN modules failing to check for write errors (fix it)

Replies are listed 'Best First'.
Re: Re: CPAN modules failing to check for write errors (fix it)
by diotalevi (Canon) on May 30, 2004 at 15:31 UTC

    Extend Fatal to support universally overriding print / syswrite / printf etc. such that failures are reported.

    This is an interesting idea. Did you have any ideas about how this might be done other than doing something s///-like to the optree?

    Match (?:print|syswrite|printf|etc).

    print

    Replace it with $1 || carp( "$1 has failed catastrophically: $!" )

    or
       print
          ...
       entersub
          ...

    Is that what you were proposing? Can you think of any way to perform a net-equivalent operation without requiring that the optree be altered?

Re: Re: CPAN modules failing to check for write errors (fix it)
by Anonymous Monk on May 29, 2004 at 23:39 UTC
    Wow, you sure picked the wrong way to try to fix this problem. This 'fix as many places where writing is done in as many CPAN modules as we can' idea is just plain untenable.
    Hold on, I havn't picked any way to fix this - I gave an example of the kind of thing I would *expect* to see in modules on CPAN, and I'm simply seeing what others think. IIRC there's already a pragma to force system errors to die instead of return false (though I can't remember it off hand), but that really isnt the point.

    I'm not suggesting every/anyone goes through every module on CPAN fixing stuff in the manner of the *example* I gave - I'm saying authors should be thinking about these things *before* releasing modules to CPAN or maybe there should be be some basic quality checks on modules before they get released to CPAN.

    Without such, I'll continue to not check the results of write operations but to warn of close failures.
    Warn or die on close failures? If you just warn, that's fine - carry on doing what you do, but at some point you'll lose data and probably never realise it unless you've got a sig warn handler installed.

    You or I or anyone else could use, say, XML::Smart and write a script that appeared to run fine but actually failed to output data. Anyone seriously suggesting that's fine needs their head examining IMHO, and I'm amazed that a number of replies have said exactly that.

    Edit by tye, remove PRE tags, replace with BLOCKQUOTE