রুবি এবং / অথবা রেলগুলিতে কাস্টম ত্রুটির ধরণের সংজ্ঞা কোথায় দেওয়া যায়?


149

কোনও রুবি লাইব্রেরিতে (রত্ন) বা রুবে অন রেল অ্যাপ্লিকেশনটিতে কাস্টম ত্রুটির ধরণের সংজ্ঞা দেওয়ার জন্য কি সেরা অনুশীলন রয়েছে? বিশেষ করে:

  1. প্রকল্পে তারা কাঠামোগতভাবে অন্তর্ভুক্ত কোথায়? একটি পৃথক ফাইল, প্রাসঙ্গিক মডিউল / বর্গ সংজ্ঞা সহ অন্য কোথাও?
  2. কোন নিয়মাবলী যখন কায়েম যে করতে এবং কখন না একটি নতুন ত্রুটির প্রকার সৃষ্টি করেছেন?

বিভিন্ন লাইব্রেরিতে বিভিন্ন জিনিস করার বিভিন্ন উপায় রয়েছে এবং আমি কোনও বাস্তব নিদর্শন লক্ষ্য করিনি। কিছু লাইব্রেরি সর্বদা কাস্টম ত্রুটির ধরণের ব্যবহার করে অন্যরা এগুলি সর্বদা ব্যবহার না করে; কারও কারও কাছে স্ট্যান্ডার্ডেরর প্রসারিত সমস্ত ত্রুটি রয়েছে আবার অন্যরা হায়ারার্কিগুলিকে নেস্ট করেছে; কিছু কেবল খালি শ্রেণির সংজ্ঞা, অন্যের কাছে সমস্ত ধরণের চালাক কৌশল রয়েছে।

ওহ, এবং কেবলমাত্র এই "ত্রুটি প্রকারগুলি" বলা আমার কাছে অস্পষ্টতার মতো বলে মনে হচ্ছে, আমি যা বলতে চাইছি তা হ'ল:

class AuthenticationError < StandardError; end
class InvalidUsername < AuthenticationError; end

উত্তর:


219

রত্নের জন্য

আমি অনেকবার দেখেছি যে আপনি ব্যতিক্রমগুলি এইভাবে সংজ্ঞায়িত করেছেন:

gem_dir / lib / অনুপস্থিত gem_name / exceptions.rb

এবং হিসাবে সংজ্ঞায়িত:

module GemName

  class AuthenticationError < StandardError; end
  class InvalidUsername < AuthenticationError; end

end

এর উদাহরণ হ'ল httpartyএরকম কিছু হবে

রুবেল অন রেলে For

এগুলি আপত্তি.আরবি নামে একটি ফাইলের নীচে আপনার লিবিব / ফোল্ডারে রাখুন, যা দেখতে এরকম কিছু হবে:

module Exceptions
  class AuthenticationError < StandardError; end
  class InvalidUsername < AuthenticationError; end
end

এবং আপনি এটি এর মতো ব্যবহার করবেন:

raise Exceptions::InvalidUsername

রত্নগুলির জন্য, দেখে মনে হচ্ছে আপনার ব্যতিক্রম ফাইলও অন্তর্ভুক্ত থাকতে পারে। এই উদাহরণটি আবার দেখুন httparty: github.com/jnunemaker/httparty/blob/…
জেসন সোয়েট

37
এগুলিকে Exceptionsমডিউলটিতে নামকরণ কেন ?
এবিমাগিল

13
আমি মনে করি যে /libএটি ত্রুটির জন্য জায়গা নাও হতে পারে। এগুলি খুব অ্যাপ্লিকেশন নির্দিষ্ট এবং আমি এই ধারণার আওতায় আছি যে কোডটি আমি দিচ্ছি /libসেটি হ'ল এমন কোড যা অন্য অ্যাপ্লিকেশনগুলিতে পুনরায় ব্যবহার করা যেতে পারে।
ওলিউয়াং

1
রুবে অন রেল নির্দেশাবলী আমার পক্ষে কাজ করে নি - সাধারণত নতুন ক্ষেত্রে এই নতুন ফাইলটি লোড করার জন্য কিছু অতিরিক্ত পদক্ষেপের দরকার কি?
মেকোহি

1
@ এ্যাবমিগিলকে মনে হচ্ছে আমার অন্যথায় Unable to autoload constant Exceptions, expected /app/lib/exceptions.rb to define itবিকল্পটি আমার মনে হয় ব্যতীত এক শ্রেণির হতে হবে
ryan2johnson9

25

আমি মনে করি আপনার প্রকল্পে সমন্বিত উত্স ফাইল থাকার জন্য, আপনার ক্লাসে ত্রুটিগুলি সংজ্ঞায়িত করা উচিত যেখানে সেগুলি নিক্ষেপ করতে পারে এবং অন্য কোথাও নেই।

কিছু উত্তরাধিকারী সহায়ক হতে পারে - নামের স্থানগুলি অপ্রয়োজনীয় স্ট্রিংগুলি টাইপের নামের বাইরে রাখায় ভাল - তবে এটি আরও স্বাদের বিষয় provided আপনার অ্যাপ্লিকেশনটিতে কমপক্ষে একটি কাস্টম ব্যতিক্রম টাইপ রয়েছে যা আপনি আলাদা করতে ব্যবহার করেন 'ইচ্ছাকৃত' এবং 'দুর্ঘটনাজনক' ব্যতিক্রম মামলার মধ্যে।


8
তত্ত্বের ক্ষেত্রে আপনি সঠিক, যখন একই ক্লাসটি সম্পূর্ণ ভিন্ন পরিস্থিতিতে বিভিন্ন শ্রেণি দ্বারা উত্থাপিত করা যায় তখন কী ঘটে?
আলাইন

1
@ অ্যালাইন কেন ব্যতিক্রম / ত্রুটি মডিউলে একাধিক শ্রেণীর দ্বারা ব্যবহৃত এই ত্রুটিগুলি সংজ্ঞায়িত করবেন না, তবে অন্য সমস্তগুলিকে একক শ্রেণিতে সংজ্ঞায়িত করেন যা তাদের ব্যবহার করে?
স্কট ডব্লিউ

@ স্কটডব্লু, সেক্ষেত্রে আমরা চেক করার জন্য মনে রাখতে বিকাশকারীদের উপর নির্ভর করছি।
জোশ সেন্ট জ্যাক

22

রেল আপনি app/errorsডিরেক্টরি করতে পারেন

# app/errors/foo_error.rb
class FooError < StandardError; end

স্প্রিং / সার্ভার পুনরায় আরম্ভ করুন এবং এটি নেওয়া উচিত


কীভাবে এই ব্যতিক্রমগুলি বাড়াব?
নিখিল ওঘ

@ নিখিলওয়াগ হয় raise FooError, "Example message..."বাraise FooError.new("Example message...")
স্কেপেট

13

এটি একটি পুরানো প্রশ্ন, তবে আমি কীভাবে রেলগুলিতে কাস্টম ত্রুটিগুলি পরিচালনা করছি ত্রুটি বার্তাগুলি সংযুক্তকরণ, পরীক্ষা করা এবং ActiveRecordমডেলগুলির সাহায্যে এটি কীভাবে পরিচালনা করব তা সহ আমি ভাগ করে নিতে চেয়েছিলাম ।

কাস্টম ত্রুটি তৈরি করা হচ্ছে

class MyClass
  # create a custome error
  class MissingRequirement < StandardError; end

  def my_instance_method
    raise MyClass::MissingRequirement, "My error msg" unless true   
  end
end

পরীক্ষা (সর্বনিম্ন)

test "should raise MissingRequirement if ____ is missing"
  # should raise an error
  error = assert_raises(MyClass::MissingRequirement) {
    MyClass.new.my_instance_method
  }

  assert error.message = "My error msg"
end

অ্যাক্টিভেকর্ডের সাথে

আমি মনে করি এটি লক্ষণীয় যে কোনও ActiveRecordমডেল নিয়ে কাজ করা হলে একটি জনপ্রিয় প্যাটার্ন হ'ল নীচে বর্ণিত মডেলটিতে ত্রুটি যুক্ত করা যাতে আপনার বৈধতা ব্যর্থ হয়:

def MyModel < ActiveRecord::Base
  validate :code_does_not_contain_hyphens

  def code_does_not_contain_hyphens
    errors.add(:code, "cannot contain hyphens") if code.include?("-")
  end
end

যখন বৈধতাগুলি চালিত হয়, তখন এই পদ্ধতিটি অ্যাক্টিভেকর্ডের ActiveRecord::RecordInvalidত্রুটি শ্রেণিতে পিগ-ব্যাক করবে এবং বৈধতাগুলিকে ব্যর্থ করে দেবে।

আশাকরি এটা সাহায্য করবে!


9

একাধিক কাস্টম ত্রুটি শ্রেণীর জন্য রেল ৪.১.১০-তে প্রত্যাশা অনুযায়ী অটলয়েডিং কাজ করে তা নিশ্চিত করার জন্য, আপনি প্রত্যেকটির জন্য পৃথক ফাইল নির্দিষ্ট করতে চাইবেন। এটির গতিশীল পুনরায় লোডিংয়ের সাথে বিকাশে কাজ করা উচিত।

সাম্প্রতিক প্রজেক্টে আমি এভাবেই ত্রুটিগুলি সেটআপ করি:

ভিতরে lib/app_name/error/base.rb

module AppName
    module Error
        class Base < StandardError; end
    end
end

এবং পরবর্তী কাস্টম ত্রুটিগুলিতে যেমন পছন্দ করে lib/app_name/error/bad_stuff.rb

module AppName
    module Error
        class BadStuff < ::AppName::Error::Base; end
    end
end

তারপরে আপনার ত্রুটিগুলি কল করে সক্ষম হতে হবে:

 raise AppName::Error::BadStuff.new("Bad stuff just happened")

এবং যদি আপনি প্রতিটি নতুন ত্রুটির জন্য পৃথক ফাইল চান না, কেবল তাদের lib/app_name/error.rb
সমস্তটি রাখুন

একটি পেয়ে uninitialized constant MyController::AppName। আমি আমার
নিয়ামককে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.