2012-03-27 11 views
6

मैं रूबी में एओपी का उपयोग करके अपवादों को संभालने की कोशिश कर रहा हूं। टूलकिट मैंने यहां उपयोग किया है एक्वेरियम (http://aquarium.rubyforge.org/)।रूबी अपवाद में सिस्टमस्टैक एरर एक्वेरियम (आस्पेक्ट ओरिएंटेड प्रोग्रामिंग) का उपयोग करके हैंडलिंग

मैंने एक नमूना कोड लिखा है जो लिखित नीचे नियंत्रक वर्ग के सभी वंशज (उप-वर्ग) को मैप करने का प्रयास करेगा।

निम्न प्रोग्राम को निष्पादित करने पर, मुझे सिस्टमस्टैक त्रुटि मिलती है (मैंने "ulimit -s" का उपयोग करके स्टैक सीमा सेट करने का भी प्रयास किया है)। कृपया कोई मेरी मदद करो! या मैपिंग पर कोई सुझाव: सुपरक्लास के उप-वर्गों के all_methods स्वागत है .. अग्रिम धन्यवाद।

require 'aquarium' 

include Aquarium::Aspects 

class ApplicationController 
end 

class Abc < ApplicationController 
    def func 
     puts "func called" 
     raise Exception.new # SystemStackError is thrown before reaching place 
    end  
end 

    #Dummy class 
class Def < ApplicationController 
end 

Aspect.new :after_raising => Exception, 
    :in_types_and_descendents => "ApplicationController" do |jp, object, *args| 
     puts "Exception Handling Code" 
end 

a = Abc.new 
a.func 
+0

पाया जा सकता है मुझे यकीन है कि अगर इस समस्या है नहीं कर रहा हूँ, लेकिन आप को बढ़ाने और StandardError बचाव करना चाहिए, के रूप में अपवाद काफी गंभीर त्रुटियों में शामिल कर सकते हैं। –

+0

नहीं, यहां तक ​​कि यह काम नहीं करता है! –

+0

हो सकता है कि आप ऐसा कुछ इस्तेमाल कर सकें http://apidock.com/rails/ActiveSupport/Rescuable/ClassMethods/rescue_from? – Fivell

उत्तर

1

आपको ऐसी विधि का उपयोग करने के लिए अनिवार्य किया गया है जो केवल जावा जैसी भाषाओं के लिए समझ में आता है, जिसमें मॉड्यूल (या स्कैला के लक्षण) नहीं हैं? मॉड्यूल को शामिल करके आप इसे बिना किसी अतिरिक्त काम के प्राप्त कर सकते हैं जहां आपको self.send के साथ इसकी आवश्यकता है: शामिल या समान, जब तक आपको मॉड्यूल फ़ाइल की आवश्यकता होती है।

किसी भी घटना में मेरा सुझाव है कि आप यह समझने के लिए कि आप रूबी में अपवाद कैसे काम करते हैं, यह समझने के लिए कि आप जावा के समान नहीं हैं - जैसा कि बताया गया है, एवीडी ग्रिम के असाधारण रूबी को पढ़ते हैं।

रूबी को निर्भरता इंजेक्शन की आवश्यकता नहीं है - यह पूरी तरह से भाषा के दर्शन के लिए अनुबंधित है।

1

आप इसे प्राप्त करने के लिए अपने छोटे मणि - aspector का उपयोग भी कर सकते हैं।

पहलू का उपयोग करके, पहलू नियमित रूबी कक्षाएं हैं, जिसमें आप विधि निष्पादन के पहले/बाद में तर्क परिभाषित करते हैं। पहलुओं का स्वतंत्र रूप से परीक्षण किया जा सकता है, और कक्षाओं में लागू किया जा सकता है। मैं नीचे दिए गए कोड उदाहरण को शामिल किया है, लेकिन एक पूरी उदाहरण here

class ExceptionHandler < Aspector::Base 
    around options[:methods] do |proxy, *args, &block| 
    begin 
     proxy.call *args, &block 
    rescue Exception => e 
     puts "Exception Handling Code" 
    end 
    end 
end 

ExceptionHandler.apply Abc, :methods => Abc.instance_methods 

a = Abc.new 
a.func 
संबंधित मुद्दे

 संबंधित मुद्दे