ระบุสิ่งที่เอกสารหลักของทับทิมException
ซึ่งข้อผิดพลาดอื่น ๆ ทั้งหมดได้รับการสืบทอดมาระบุ#message
ส่งคืนผลลัพธ์ของการเรียกใช้ข้อยกเว้น to_s โดยปกติจะส่งคืนข้อความหรือชื่อของข้อยกเว้น ด้วยการจัดหาเมธอด 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
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 Strategy
นี่เป็นกลยุทธ์ที่ใกล้เคียงที่สุดกับการใช้งานที่ฉันเคยใช้ในราง ตามที่ระบุไว้ข้างต้นก็ใช้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)
เครื่องมือสาธิต
นี่คือการสาธิตเพื่อแสดงการช่วยเหลือและการส่งข้อความของการใช้งานข้างต้น คลาสที่เพิ่มข้อยกเว้นคือ API ปลอมไปยัง Cloudinary เพียงทิ้งหนึ่งในกลยุทธ์ข้างต้นลงในคอนโซลรางของคุณตามด้วยสิ่งนี้
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 + Crescue MyCustomError => e
ฉันทำ