রুবি কোর ডকুমেন্টেশন কী দেওয়া হয়েছে Exception
, যা থেকে অন্যান্য সমস্ত ত্রুটিগুলি উত্তরাধিকার সূত্রে লিখিত হয়েছে#message
চাওয়া ব্যতিক্রমের ফলাফল.ট_সগুলি প্রদান করে Return সাধারণত এটি ব্যতিক্রমের বার্তা বা নামটি দেয়। একটি টো_সেটর সরবরাহ করে, ব্যতিক্রমগুলি যেখানে স্ট্রিংস প্রত্যাশিত সেখানে ব্যবহৃত হতে সম্মত হচ্ছে।
http://ruby-doc.org/core-1.9.3/Exception.html#method-i-message
আমি পুনরায় সংজ্ঞা to_s
/ to_str
বা আরম্ভকারীটিকে বেছে নেব । এখানে একটি উদাহরণ যেখানে আমরা জানতে চাই, বেশিরভাগ মানুষের পাঠযোগ্য উপায়ে, যখন কোনও বাহ্যিক পরিষেবা কোনও কাজ করতে ব্যর্থ হয়।
দ্রষ্টব্য: নীচের দ্বিতীয় কৌশলটিতে রেলগুলি সুন্দর স্ট্রিং পদ্ধতিগুলি ব্যবহার করে, যেমন demodualize
, কিছুটা জটিল এবং তাই কোনও ব্যতিক্রম করার জন্য এটি সম্ভবত বুদ্ধিমান। আপনি প্রয়োজন হলে পদ্ধতি স্বাক্ষরে আরও যুক্তি যুক্ত করতে পারেন।
ওভাররাইডিং # থেকে_স কৌশল নয় ওভাররাইডিং, এটি ভিন্নভাবে কাজ করে
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
begin; raise ExternalService::FailedToCreateError, 'custom message'; rescue => e; e.message; end
begin; raise ExternalService::FailedToCreateError.new('custom message'); rescue => e; e.message; end
raise ExternalService::FailedToCreateError
#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
begin; raise ExternalService::FailedToCreateError, Object.new; rescue => e; e.message; end
begin; raise ExternalService::FailedToCreateError.new(Object.new); rescue => e; e.message; end
raise ExternalService::FailedCRUDError
raise ExternalService::FailedCRUDError.new(Object.new)
ডেমো সরঞ্জাম
উপরোক্ত বাস্তবায়নটি উদ্ধার এবং বার্তা প্রদর্শন করার জন্য এটি একটি ডেমো। ব্যতিক্রমগুলি উত্থাপনকারী ক্লাসটি ক্লাউডাইনারি এর একটি নকল এপিআই। উপরের কৌশলগুলি থেকে কেবল আপনার রেল কনসোলে ফেলে দিন, তারপরে এটি।
require 'rails'
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
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 = [
ExternalService::FailedCRUDError,
ExternalService::FailedToCreateError,
ExternalService::FailedToReadError,
ExternalService::FailedToUpdateError,
ExternalService::FailedToDeleteError,
ExternalService::FailedCRUDError.new,
ExternalService::FailedToCreateError.new,
ExternalService::FailedToReadError.new,
ExternalService::FailedToUpdateError.new,
ExternalService::FailedToDeleteError.new,
[ExternalService::FailedCRUDError, Object.new],
[ExternalService::FailedToCreateError, Object.new],
[ExternalService::FailedToReadError, Object.new],
[ExternalService::FailedToUpdateError, Object.new],
[ExternalService::FailedToDeleteError, Object.new],
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
।