PHPFixing
  • Privacy Policy
  • TOS
  • Ask Question
  • Contact Us
  • Home
  • PHP
  • Programming
  • SQL Injection
  • Web3.0

Tuesday, July 12, 2022

[FIXED] How can I get Ruby 2.1.5 to report an object's class for a missing method error?

 July 12, 2022     exception, message, method-missing, ruby     No comments   

Issue

This line:

@page = @page.launch_profile(@profile_name)

is causing this error:

undefined method `launch_profile' for #<Object:0x007f9013d785e8> (NoMethodError)

If I add puts "Page = #{@page} "{@page.class}" immediately before the call that complains, I get

Page = #<OwnProfilePage:0x007f9013bf5e78> OwnProfilePage

What's weird is that on the command-line, the same version of Ruby (2.1.5) does this:

$ ruby -le 'class Dog; end; Dog.new.foo'
-e:1:in `<main>': undefined method `foo' for #<Dog:0x007fb64120c6d8> (NoMethodError)

so I know it usually works.

I've tried adding a method_missing() method to Object, but it affected nothing, so I presume someone else, somewhere else, is monkey-patching or overriding or otherwise meta-buggering things. I even patched NoMethodError.new() to print a stack trace to try to locate the errant code.

Further, is there a reasonably general to work out which bit of a Ruby system is doing what, when there's potentially so much voodoo and other poorly-conceived global-change nonsense going on in far flung and random gems? (In another case, 'fail' started reporting the previous rescued exception's message, instead of the string I supplied it with.)


Solution

OK, I found out what's going on:

It's calabash-android's ABase class, whose method_missing 'helpfully' delegates to its world object, which also doesn't know about my method (unsurprisingly). Unfortunately, its author failed to think about catching exceptions when his/her surprising implementation detail failed, so it's reporting not my page object but the world object and making Ruby look broken.

Had I looked at my logging's hexagibberish carefully, I'd have noticed it wasn't Ruby misreporting my page object's class, but correctly reporting a completely different object (although the object's class isn't Object, but Object+Test::Unit::Assertions+half+a+million+other+mixins which would have more rapidly clued me in that it was reporting about the wrong thing).

I've wrapped that method_missing's body in a try/catch that reports the real object and also mentions that nothing in world knows about it either.

This is one of the main reasons I dislike magic: people generally fail to provide proper diagnostics. The other main reason is because magic used to implement surprising behaviour transparently is evil.



Answered By - android.weasel
Answer Checked By - David Goodson (PHPFixing Volunteer)
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg
Newer Post Older Post Home

0 Comments:

Post a Comment

Note: Only a member of this blog may post a comment.

Total Pageviews

Featured Post

Why Learn PHP Programming

Why Learn PHP Programming A widely-used open source scripting language PHP is one of the most popular programming languages in the world. It...

Subscribe To

Posts
Atom
Posts
Comments
Atom
Comments

Copyright © PHPFixing