From: Marc-Andre Lafortune Date: 2010-03-02T13:45:11+09:00 Subject: [ruby-core:28395] [Bug #2830] Some methods raise ArgumentError instead of TypeError Bug #2830: Some methods raise ArgumentError instead of TypeError http://redmine.ruby-lang.org/issues/show/2830 Author: Marc-Andre Lafortune Status: Open, Priority: Normal Assigned to: Marc-Andre Lafortune, Category: core, Target version: 1.9.2 ruby -v: ruby 1.9.2dev (2010-03-02 trunk 26792) [x86_64-darwin10.2.0] Some methods of Ruby 1.9 expect integers/reals and call internally nurat_int_value/nurat_int_check. These functions raise an ArgumentError when the argument is not an Integer, instead of a TypeError. Thus: 42.gcd(:foo) # => ArgumentError, should be TypeError 42.lcm(:foo) # => ditto 42.gcdlcm(:foo) # => ditto Rational(:foo,1) # => ditto Note that on the other hand: Rational(nil, 1) # => TypeError Rational(:foo) # => TypeError In a similar fashion: Complex.rect(nil) # => ArgumentError, should be TypeError Complex.polar(nil) # => ditto Unless there is objection, I will commit the following patch (and fix RubySpec): diff --git a/complex.c b/complex.c index 214d3a2..6742257 100644 --- a/complex.c +++ b/complex.c @@ -377,7 +377,7 @@ nucomp_real_check(VALUE num) break; default: if (!k_numeric_p(num) || !f_real_p(num)) - rb_raise(rb_eArgError, "not a real"); + rb_raise(rb_eTypeError, "not a real"); } } diff --git a/rational.c b/rational.c index 65d3cf4..f5a6d26 100644 --- a/rational.c +++ b/rational.c @@ -419,7 +419,7 @@ nurat_int_check(VALUE num) break; default: if (!k_numeric_p(num) || !f_integer_p(num)) - rb_raise(rb_eArgError, "not an integer"); + rb_raise(rb_eTypeError, "not an integer"); } } ---------------------------------------- http://redmine.ruby-lang.org