From: Jacob Repp Date: 2006-02-21T15:37:09+09:00 Subject: Need help understanding exceptions handling from C extensions I'm working on the test cases for my AIO extension library on windows and I have been running into this error consistently on one of my tests: test_addr_lookup_name_async(ClientTest): ArgumentError: NULL pointer given tc_client.rb:129:in `to_s' tc_client.rb:129:in `test_addr_lookup_name_async' The offending line is in the rescue block: begin q = AIOQueue.new a = AIOAddr.new(q) c = Callback.new n = 0 assert(a.is_attached?, "should be attached") a.lookup("www.google.com", c, :lookup_complete) 5.times { n += q.process(100) } assert(c.lookups == 1, "didn't receive lookup callback") assert(n == 1, "not enough contexts processed") rescue Exception => ex puts "caught #{ex}" end The exception is raised from q.process which hooks directly to a C functions and makes another function call to an internal API I defined. In this code I have my async context handler: case CTX_ADDR_LOOKUP: rb_funcall( pctx->recvr, pctx->symbid, 1, UINT2NUM(((Address*)(pctx->pbase))->addr.sin_addr.s_addr)); I believe this is 'raising' an exception. I see in other extensions the usage of rb_protect() etc. I am under the impression that setjmp, longjmp is being used to simulate exceptions in ruby, of which I'm unfortunately not an expert in the usage. I would like to be able to call out to ruby code without losing my instruction pointer so that I may deliver the error to a registered async error facility. If someone could smack me over the head with a clue-by-four right now that would be most appreciated ;) Of course I will continue learning and experimenting but I thouht this would be a good time to solicit the knowledge of ruby-talk.