Exception
Diğer tüm hataların miras aldığı Ruby çekirdek belgesinin ne ifade ettiği göz önüne alındığında#message
İstisna.to_s çağrılmasının sonucunu döndürür. Normalde bu, istisnanın mesajını veya adını döndürür. Bir to_str yöntemi sağlayarak, dizelerin beklendiği durumlarda istisnalar kullanılmayı kabul eder.
http://ruby-doc.org/core-1.9.3/Exception.html#method-i-message
Yeniden tanımlamayı to_s
/ to_str
veya başlatıcıyı tercih ederim . Burada, harici bir hizmetin bir şeyi yapamaması durumunda, çoğunlukla insan tarafından okunabilir bir şekilde bilmek istediğimiz bir örnek var.
NOT: Aşağıdaki ikinci strateji demodualize
, biraz karmaşık olabilen ve bu nedenle bir istisna durumunda yapılması akıllıca olmayan raylar gibi oldukça dize yöntemlerini kullanır . İhtiyaç duymanız halinde yöntem imzasına daha fazla argüman da ekleyebilirsiniz.
#To_s Stratejisini #to_str yerine geçersiz kılmak , farklı şekilde çalışır
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
Konsol Çıkışı
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
#İnitialize Stratejisini Geçersiz Kılma
Raylarda kullandığım uygulamalara en yakın strateji bu. Yukarıda belirtildiği gibi, bu kullanır demodualize
, underscore
ve humanize
ActiveSupport
yöntemler. Ancak bu, önceki stratejide olduğu gibi kolayca kaldırılabilir.
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
Konsol Çıkışı
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)
Demo Aracı
Bu, yukarıdaki uygulamanın kurtarılmasını ve mesajlaşmasını gösteren bir demodur. İstisnaları yükselten sınıf, Cloudinary için sahte bir API'dir. Yukarıdaki stratejilerden birini ray konsolunuza boşaltın, ardından bunu yapın.
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
. Varsayılan daha geniş olduğunurescue => e
uzanırStandardError
ve Ctrl + C dahil olmak üzere her şeyi yakalar. Yapardımrescue MyCustomError => e
.