System() shouldn't throw exceptions, should it?

While building a Rubyx distro (the build script is written in ruby) a user has
reported this error:

Making 'whatis' database...

Unmounting proc
/mnt/rubyx/rubyx-76/rubyx:946:in `system': No such file or directory -
makewhatis /man (Errno::ENOENT)
        from /mnt/rubyx/rubyx-76/rubyx:946:in `install'
        from /mnt/rubyx/rubyx-76/rubyx:800:in `each'
        from /mnt/rubyx/rubyx-76/rubyx:800:in `install'
        from /mnt/rubyx/rubyx-76/rubyx:1492
        from /mnt/rubyx/rubyx-76/rubyx:1087:in `catch'
        from /mnt/rubyx/rubyx-76/rubyx:1087
root@aydindril:/mnt/rubyx/linux-2.6.7/linux-2.6.7#

The bit of code running here looks like this:

if $root=='/'
        puts("Making 'whatis' database...")
        system("makewhatis /man")
end

Now makewhatis is not available, but the system() command has thrown an
exception, which shouldn't happen (should it?).

According to ri system,

--------------------------------------------------------- Kernel::system
     system( aCmd [, args]* ) -> true or false

···

------------------------------------------------------------------------
     Executes aCmd in a subshell, returning true if the command was
     found and ran successfully, false otherwise. A detailed error code
     is available in $?. The arguments are processed in the same way as
     for Kernel::exec on page 419.

So on failure it should just return false?

Am I reading this correctly? Could this be ruby version specific?

Andrew Walrond

The user reports this was a nightly snapshot:

"ruby 1.9.0 (2004-06-25) [i686-linux]"

Hi,

At Tue, 29 Jun 2004 04:22:27 +0900,
Andrew Walrond wrote in [ruby-talk:104791]:

Am I reading this correctly? Could this be ruby version specific?

Yes, it was changed in the February.

···

--
Nobu Nakada

Just so I've got this clear in my mind...

This is an intentional change, and I should expect this new behaviour in
future releases of ruby?

Will it appear in the current series of stable snapshots? Or is it slated for
1.9 onwards?

I don't think I overstate the case if I say that this change is going to bust
a whole lot of ruby code; system() is fairly fundamental...

Shouldn't this new functionality be moved to 'system2()' or something?

Andrew Walrond

···

On Tuesday 29 Jun 2004 02:20, nobu.nokada@softhome.net wrote:

Yes, it was changed in the February.

I think that throwing an exception is a much more appropriate and
idiomatic way to handle errors than just silently failing. If it's
going to break a lot of your code, though, why not use something like
the following at the top of your top-level library code (or, include
it in another library called something like 'old-system.rb'):

major, minor, release = VERSION.split('.').collect {|s| s.to_i}
if (major == 1 and minor > 8) or (major > 1)
  alias new_system system
  def system(*args)
    begin
      new_system(*args)
    rescue Errno::ENOENT
      return false
    end
  end
end

...or something similar.

Lennon

I agree. It would have been better to throw exceptions, and I can easily
change my code to handle either case, as you suggest.

But...

I guess I was a bit suprised that this fundamental behaviour was changed; It
obviously breaks backwards compatibility with previous versions; It broke at
least one of my apps and I'll have to audit the rest. Many existing apps
_will_be_broken_ by this change.

Hence my question: Assuming the change is intentional, when will it appear in
a release (this cropped up with somebody using a nightly snapshot)

Andrew Walrond

···

On Tuesday 29 Jun 2004 17:18, Lennon Day-Reynolds wrote:

I think that throwing an exception is a much more appropriate and
idiomatic way to handle errors than just silently failing. If it's
going to break a lot of your code, though, why not use something like

see my RCR/BUG? thread - i think it's even worse than you are already pointing
out...

-a

···

On Wed, 30 Jun 2004, Andrew Walrond wrote:

On Tuesday 29 Jun 2004 17:18, Lennon Day-Reynolds wrote:

I think that throwing an exception is a much more appropriate and
idiomatic way to handle errors than just silently failing. If it's
going to break a lot of your code, though, why not use something like

I agree. It would have been better to throw exceptions, and I can easily
change my code to handle either case, as you suggest.

But...

I guess I was a bit suprised that this fundamental behaviour was changed; It
obviously breaks backwards compatibility with previous versions; It broke at
least one of my apps and I'll have to audit the rest. Many existing apps
_will_be_broken_ by this change.

Hence my question: Assuming the change is intentional, when will it appear in
a release (this cropped up with somebody using a nightly snapshot)

Andrew Walrond

--

EMAIL :: Ara [dot] T [dot] Howard [at] noaa [dot] gov
PHONE :: 303.497.6469
A flower falls, even though we love it;
and a weed grows, even though we do not love it. --Dogen

===============================================================================