কম্পিউটার

রুবি প্রোগ্রাম থেকে কিভাবে প্রস্থান করবেন

বিকাশকারী হিসাবে, আমরা আমাদের প্রোগ্রামগুলি চালানোর জন্য এত বেশি সময় ব্যয় করি যে তারা কীভাবে প্রস্থান করে তা উপেক্ষা করা সহজ। এবং এটা গুরুত্বপূর্ণ! যখন আপনার প্রোগ্রামগুলি প্রস্থান করার সময় সঠিকভাবে আচরণ করে, তখন এটি তাদের পরিচালনা করা অনেক সহজ করে তোলে এবং তাদের স্ট্যান্ডার্ড ডেভপস সরঞ্জামগুলির সাথে কাজ করার সম্ভাবনা বেশি করে তোলে৷

আপনি রুবি প্রোগ্রাম থেকে প্রস্থান করতে পারেন এমন অনেক উপায় রয়েছে। আমি নীচে তাদের কিছু দেখিয়েছি. এই পোস্টে আমরা এগুলির প্রতিটির বিশদ বিবরণ নিয়ে আলোচনা করব, এবং কীভাবে সেগুলি আপনার অ্যাপটিকে একটি ভাল আচরণ করা ইউনিক্স নাগরিক হিসাবে ব্যবহার করা যেতে পারে৷

# You can exit by calling a method
exit
exit!
abort("She cannot take any more of this, Captain!")

# ...or by failing to catch an exception
raise("Destroyed...")
fail

# ...or by letting the program end naturally. :)

প্রস্থান কোড, এবং আপনি

আপনি Linux এবং OSX-এ চালান এমন প্রতিটি প্রোগ্রাম চালানো শেষ হলে একটি প্রস্থান স্ট্যাটাস কোড প্রদান করে। আপনি সাধারণত প্রস্থান কোড দেখতে পাবেন না। প্রোগ্রামটি স্বাভাবিকভাবে প্রস্থান করা হয়েছে কিনা বা কোন ত্রুটি আছে কিনা তা নির্ধারণ করতে পর্দার পিছনে OS দ্বারা এটি ব্যবহার করা হয়৷

আপনি যদি ব্যাশ ব্যবহার করেন, তাহলে $? পরীক্ষা করে আপনি যে প্রোগ্রামটি চালিয়েছেন তার এক্সিট কোড দেখতে পাবেন পরিবেশ সূচক. নীচের উদাহরণটি ব্যর্থতার জন্য প্রস্থান কোড দেখায়, তারপর সাফল্যের জন্য৷

% ls this-file-doesnt-exist
ls: this-file-doesnt-exist: No such file or directory
blog% echo $?
1
% ls .
bm.rb 
% echo $?
0

সাধারণত, ইউনিক্স-ভিত্তিক সিস্টেমের নিয়ম হল যে শূন্য মানে সাফল্য। Nonzero মানে ব্যর্থতা।

আপনি যদি কখনও && ব্যবহার করে থাকেন ব্যাশে "অপারেটর", তারপর আপনি স্ট্যাটাস কোড ব্যবহার করেছেন। নীচের উদাহরণে, আমরা ব্যাশকে বলি প্রোগ্রাম B চালানোর জন্য শুধুমাত্র যদি A প্রোগ্রাম সফল হয়।

% a && b

আপনি এই কৌশলটি অনেক উপায়ে ব্যবহার করতে পারেন। উদাহরণ স্বরূপ, আপনি হয়তো সম্পদগুলিকে প্রি-কম্পাইল করতে চান এবং সেগুলিকে একটি CDN এ আপলোড করতে পারেন৷

blog% rake assets:precompile && rake cdn:upload_assets

রুবি দিয়ে একটি প্রস্থান অবস্থা নির্দিষ্ট করা

রুবি আমাদের জন্য প্রস্থান স্ট্যাটাস উপাদান অনেক যত্ন নেয়. আপনার প্রোগ্রাম স্বাভাবিকভাবে প্রস্থান করলে, এটি একটি "সফল" স্থিতি ফেরত দেয়। যদি এটি একটি অপ্রকাশিত ব্যতিক্রমের কারণে ব্যর্থ হয় তবে এটি একটি "ব্যর্থতার" অবস্থা দেয়। নীচে আমি একটি স্ক্রিপ্টের জন্য প্রস্থান কোড দেখাচ্ছি যা একটি ব্যতিক্রম উত্থাপন করেছে৷

% ruby err.rb
err.rb:1:in `<main>': goodbye (RuntimeError)
tmp% echo $?
1

কিন্তু আপনি যদি কোনো অপ্রকাশিত ব্যতিক্রম না চান? আপনি যদি পরিষ্কারভাবে প্রস্থান করতে চান, কিন্তু তারপরও একটি "ব্যর্থ" ত্রুটি কোড ফেরত দিতে চান তাহলে কী হবে? তাছাড়া, যদি আপনি একটি ত্রুটি বার্তা সহ একটি কাস্টম কোড ফেরত দিতে চান?

সৌভাগ্যবশত, এটা বেশ সহজ. শুধু exit-এ একটি আর্গুমেন্ট পাস করুন ফাংশন যুক্তি একটি বুলিয়ান বা একটি পূর্ণসংখ্যা হতে পারে. যদি এটি বুলিয়ান হয়, তাহলে সত্য মানে সাফল্য। যদি এটি 0 এর থেকে একটি পূর্ণসংখ্যা হয় তার মানে সাফল্য।

exit(true) # Exits with "success" code
exit(0) # Exits with "success" code

exit(false) # Exits with "failure" code
exit(1) # Exits with "failure" code

exit(436) # Custom failure error code

কিভাবে exit হুডের নিচে কাজ করে

প্রস্থান পদ্ধতিটি কেবল একটি SystemExit উত্থাপন করে ব্যতিক্রম যদি এটি ধরা না পড়ে, তবে প্রোগ্রামটি অন্য কোনো ধরা না পড়া ব্যতিক্রমের মতোই বাতিল হয়ে যায়। এটা বেশ চমৎকার, তবে কিছু আকর্ষণীয় ফলাফল আছে।

আপনি যদি সমস্ত SystemExit ব্যতিক্রমগুলি গ্রাস করতে চান তবে আপনি প্রস্থান পদ্ধতিটি ভেঙে দেবেন। আমি নীচের উদাহরণে এটি দেখিয়েছি৷

begin
  exit 100
rescue SystemExit => e
  puts "Tried to exit with status #{ e.status }"
end

puts "...but it never exited, because we swallowed the exception"

# Outputs:
# Tried to exit with status 100
# ...but it never exited, because we swallowed the exception

এটি Exception উদ্ধার না করার আরেকটি কারণ . কারণ SystemExit Exception থেকে উত্তরাধিকারসূত্রে প্রাপ্ত , Exception গিলে প্রস্থান বিরতির কারণ হবে৷

begin
  exit
rescue Exception # never do this
  puts "I just broke the exit function!"
end

মানব-পাঠযোগ্য ত্রুটি বার্তা

যদিও প্রস্থান কোডগুলি মেশিনের জন্য দুর্দান্ত, আমরা মানুষ প্রায়শই কিছুটা ব্যাখ্যামূলক পাঠ্য পছন্দ করি। সৌভাগ্যবশত, OS আমাদেরকে একটি আউটপুট স্ট্রীম প্রদান করে বিশেষ করে ত্রুটি বার্তার মতো জিনিসগুলির জন্য। হ্যাঁ, আমি STDERR এর কথা বলছি৷

আপনি STDERR-এ লিখতে পারেন ঠিক যেমন আপনি যেকোনো IO বস্তুতে লেখেন। নীচের উদাহরণে আমি একটি ত্রুটি বার্তা লিখছি এবং একটি "ত্রুটি" স্থিতি সহ প্রস্থান করছি৷

STDERR.puts("ABORTED! You forgot to BAR the BAZ")
exit(false)

এটি রুবি হওয়ার কারণে, অবশ্যই stdout-এ লেখার এবং একটি ত্রুটি কোড সহ প্রস্থান করার আরও সংক্ষিপ্ত উপায় রয়েছে। শুধু abort ব্যবহার করুন পদ্ধতি।

# Write the message to STDERR and exit with an error status code.
abort("ABORTED! You forgot to BAR the BAZ")

at_exit এর মাধ্যমে কলব্যাক

রুবি আপনাকে হ্যান্ডলারদের নিবন্ধন করতে দেয় যেগুলি যখনই প্রোগ্রাম থেকে বেরিয়ে যায় তখন কল করা যেতে পারে। তাদের মধ্যে একাধিক হতে পারে - তারা যে ক্রমে নিবন্ধিত হয়েছিল তার বিপরীত ক্রমে তাদের ডাকা হয়। এটি দেখতে কেমন তা এখানে:

at_exit do 
  puts "handler 1"
end

at_exit do 
  puts "handler 2"
end

# Outputs "handler2\nhandler1" on exit

প্রস্থান হ্যান্ডলার প্রস্থান কোড ওভাররাইড করতে পারেন. আপনি হ্যান্ডলারের মধ্যে থেকে প্রস্থান কল করে এটি করেন। যদিও এটা মনে হচ্ছে এটি একটি অসীম লুপ সৃষ্টি করা উচিত, এটি হয় না। :)

at_exit do 
  exit 100
end

exit 0

# This program exits with a code of 100

আপনি যদি কোনো কলব্যাক না করে প্রস্থান করতে চান, তাহলে আপনি exit! এর মাধ্যমে তা করতে পারেন। পদ্ধতি তবে মনে রাখবেন যে আপনার যদি রত্ন বা অন্যান্য তৃতীয় পক্ষের কোড থাকে যা সেই কলব্যাকের উপর নির্ভর করে তবে এটি সমস্যার কারণ হতে পারে৷

একটি আকর্ষণীয় দিক

দেখা যাচ্ছে যে প্রচুর লাইব্রেরি at_exit ব্যবহার করে উদ্ভাবনীতে - এবং কেউ কেউ বলতে পারে হ্যাকি - উপায়। উদাহরণস্বরূপ, সিনাট্রা একটি at_exit ব্যবহার করে ওয়েব অ্যাপ বুট আপ করার উপায় হিসাবে হুক করুন। এটি সার্ভার শুরু করার আগে আপনার সমস্ত কোড লোড হয়েছে তা নিশ্চিত হতে দেয়। এটি দেখতে কেমন তা এখানে:

module Sinatra
  class Application < Base

   ...

  at_exit { Application.run! if $!.nil? && Application.run? }
end

আর্কেন্সি ব্লগে এই সম্পর্কে একটি দুর্দান্ত পোস্ট রয়েছে:আমরা কি এ_এক্সিটকে অপব্যবহার করছি?


  1. রুবিতে পরিবেশের ভেরিয়েবলগুলি কীভাবে ব্যবহার করবেন

  2. রুবিতে রেক কী এবং এটি কীভাবে ব্যবহার করবেন

  3. একটি ম্যাট্রিক্স কি এবং রুবিতে এটি কীভাবে ব্যবহার করবেন?

  4. রুবিতে স্ট্রাকট এবং ওপেনস্ট্রাক্ট কীভাবে ব্যবহার করবেন