यह देखते हुए कि रूबी कोर दस्तावेज Exception
किस से, अन्य सभी त्रुटियों के वारिस हैं, के बारे में बताता है#message
अपवाद के परिणाम को वापस लौटाता है। आम तौर पर यह अपवाद का संदेश या नाम देता है। एक to_str पद्धति की आपूर्ति करके, अपवाद का उपयोग करने के लिए सहमत हो रहे हैं जहां स्ट्रिंग्स की अपेक्षा की जाती है।
http://ruby-doc.org/core-1.9.3/Exception.html#method-i-message
मैं पुनर्निर्धारण to_s
/ to_str
या आरंभीकरण का विकल्प चुनूंगा । यहां एक उदाहरण है जहां हम जानना चाहते हैं, ज्यादातर मानव पठनीय तरीके से, जब कोई बाहरी सेवा कुछ करने में विफल रही है।
नोट: नीचे दी गई दूसरी रणनीति में बहुत सुंदर तरीके जैसे रेल का उपयोग किया गया है demodualize
, जो थोड़ा जटिल हो सकता है और इसलिए संभावित रूप से एक अपवाद में ऐसा करने के लिए नासमझ है। आप विधि हस्ताक्षर के लिए और भी तर्क जोड़ सकते हैं, आपको चाहिए।
#To_s की रणनीति #to_str को ओवरराइड करने से , यह अलग तरह से काम करता है
module ExternalService
class FailedCRUDError < ::StandardError
def to_s
'failed to crud with external service'
end
end
class FailedToCreateError < FailedCRUDError; end
class FailedToReadError < FailedCRUDError; end
class FailedToUpdateError < FailedCRUDError; end
class FailedToDeleteError < FailedCRUDError; end
end
कंसोल आउटपुट
begin; raise ExternalService::FailedToCreateError; rescue => e; e.message; end
# => "failed to crud with external service"
begin; raise ExternalService::FailedToCreateError, 'custom message'; rescue => e; e.message; end
# => "failed to crud with external service"
begin; raise ExternalService::FailedToCreateError.new('custom message'); rescue => e; e.message; end
# => "failed to crud with external service"
raise ExternalService::FailedToCreateError
# ExternalService::FailedToCreateError: failed to crud with external service
ओवरराइडिंग #initialize रणनीति
यह वह रणनीति है जिसे मैंने रेल में उपयोग किए जाने वाले कार्यान्वयन के सबसे करीब रखा है। जैसा कि ऊपर बताया है, यह का उपयोग करता है demodualize
, underscore
और humanize
ActiveSupport
तरीकों। लेकिन इसे आसानी से हटाया जा सकता था, जैसा कि पिछली रणनीति में था।
module ExternalService
class FailedCRUDError < ::StandardError
def initialize(service_model=nil)
super("#{self.class.name.demodulize.underscore.humanize} using #{service_model.class}")
end
end
class FailedToCreateError < FailedCRUDError; end
class FailedToReadError < FailedCRUDError; end
class FailedToUpdateError < FailedCRUDError; end
class FailedToDeleteError < FailedCRUDError; end
end
कंसोल आउटपुट
begin; raise ExternalService::FailedToCreateError; rescue => e; e.message; end
# => "Failed to create error using NilClass"
begin; raise ExternalService::FailedToCreateError, Object.new; rescue => e; e.message; end
# => "Failed to create error using Object"
begin; raise ExternalService::FailedToCreateError.new(Object.new); rescue => e; e.message; end
# => "Failed to create error using Object"
raise ExternalService::FailedCRUDError
# ExternalService::FailedCRUDError: Failed crud error using NilClass
raise ExternalService::FailedCRUDError.new(Object.new)
# RuntimeError: ExternalService::FailedCRUDError using Object
डेमो उपकरण
यह उपरोक्त कार्यान्वयन के बचाव और संदेश दिखाने के लिए एक डेमो है। अपवाद बढ़ाने वाला वर्ग क्लाउडिनरी के लिए एक नकली एपीआई है। बस उपरोक्त रणनीतियों में से एक को अपने रेल कंसोल में डंप करें, इसके बाद।
require 'rails' # only needed for second strategy
module ExternalService
class FailedCRUDError < ::StandardError
def initialize(service_model=nil)
@service_model = service_model
super("#{self.class.name.demodulize.underscore.humanize} using #{@service_model.class}")
end
end
class FailedToCreateError < FailedCRUDError; end
class FailedToReadError < FailedCRUDError; end
class FailedToUpdateError < FailedCRUDError; end
class FailedToDeleteError < FailedCRUDError; end
end
# Stub service representing 3rd party cloud storage
class Cloudinary
def initialize(*error_args)
@error_args = error_args.flatten
end
def create_read_update_or_delete
begin
try_and_fail
rescue ExternalService::FailedCRUDError => e
e.message
end
end
private def try_and_fail
raise *@error_args
end
end
errors_map = [
# Without an arg
ExternalService::FailedCRUDError,
ExternalService::FailedToCreateError,
ExternalService::FailedToReadError,
ExternalService::FailedToUpdateError,
ExternalService::FailedToDeleteError,
# Instantiated without an arg
ExternalService::FailedCRUDError.new,
ExternalService::FailedToCreateError.new,
ExternalService::FailedToReadError.new,
ExternalService::FailedToUpdateError.new,
ExternalService::FailedToDeleteError.new,
# With an arg
[ExternalService::FailedCRUDError, Object.new],
[ExternalService::FailedToCreateError, Object.new],
[ExternalService::FailedToReadError, Object.new],
[ExternalService::FailedToUpdateError, Object.new],
[ExternalService::FailedToDeleteError, Object.new],
# Instantiated with an arg
ExternalService::FailedCRUDError.new(Object.new),
ExternalService::FailedToCreateError.new(Object.new),
ExternalService::FailedToReadError.new(Object.new),
ExternalService::FailedToUpdateError.new(Object.new),
ExternalService::FailedToDeleteError.new(Object.new),
].inject({}) do |errors, args|
begin
errors.merge!( args => Cloudinary.new(args).create_read_update_or_delete)
rescue => e
binding.pry
end
end
if defined?(pp) || require('pp')
pp errors_map
else
errors_map.each{ |set| puts set.inspect }
end
rescue Exception => e
। यह डिफ़ॉल्ट से व्यापक है,rescue => e
जोStandardError
Ctrl + C सहित सभी चीज़ों से फैलता है और पकड़ता है। मैं करता हूँrescue MyCustomError => e
।