সতর্কবাণী! সি ++ প্রোগ্রামার এখানে সম্ভবত ব্যতিক্রম-হ্যান্ডলিংয়ের কোনও প্রশ্নের উত্তর দেওয়ার চেষ্টা করা উচিত যা অন্য কোনও ভাষা সম্পর্কে অবশ্যই উত্তর দেওয়ার চেষ্টা করার বিভিন্ন ধারণা নিয়ে আসছে!
এই ধারণা দেওয়া:
উদাহরণস্বরূপ, কল্পনা করুন যে আমাদের কাছে রিচ রিসোর্স রয়েছে, যা HTTP অনুরোধ সম্পাদন করে এবং পুনরুদ্ধার করা ডেটা ফেরত দেয়। আর সার্ভিস টেম্পোরারিউভেনভ্যালেবল বা রেটলিমিটএকসিসিডের মতো ত্রুটির পরিবর্তে আমরা কেবলমাত্র একটি পুনরায় চেষ্টাযোগ্য গ্রাহককে উত্থাপন করব যা উপভোক্তাকে পরামর্শ দিচ্ছিল যে এটি কেবল অনুরোধটি আবার চেষ্টা করা উচিত এবং নির্দিষ্ট ব্যর্থতার বিষয়ে চিন্তা করা উচিত নয়।
... একটি জিনিস আমি পরামর্শ দিচ্ছি যে আপনি হয়ত কোনও ক্রিয়াকলাপের সাথে কোনও প্রতিক্রিয়া জানানোর জন্য উদ্বেগকে উদ্বেগের সাথে মিশিয়ে দিচ্ছেন যাতে আপনার কোডটির সাধারণতা হ্রাস পেতে পারে বা ব্যতিক্রমের জন্য প্রচুর "অনুবাদ পয়েন্ট" লাগতে পারে ।
উদাহরণস্বরূপ, আমি যদি কোনও ফাইল লোড করে জড়িত কোনও লেনদেনের মডেল করি তবে এটি বেশ কয়েকটি কারণে ব্যর্থ হতে পারে। সম্ভবত ফাইলটি লোড করাতে এমন একটি প্লাগইন লোড করা জড়িত যা ব্যবহারকারীর মেশিনে নেই। সম্ভবত ফাইলটি সহজেই দুর্নীতিগ্রস্থ এবং এটি পার্স করার সময় আমরা একটি ত্রুটির মুখোমুখি হয়েছি।
যাই ঘটুক না কেন, আসুন আমরা বলি যে ক্রিয়াটি অবশ্যই ব্যবহারকারীর সাথে কী ঘটেছে সে সম্পর্কে রিপোর্ট করা এবং তিনি এটি সম্পর্কে কী করতে চান সে সম্পর্কে তাকে অনুরোধ জানানো হয়েছে ("পুনরায় চেষ্টা করুন, অন্য ফাইলটি লোড করুন, বাতিল করুন")।
থ্রোয়ার বনাম ক্যাচার
এই ক্ষেত্রে আমরা কোন ধরণের ত্রুটির মুখোমুখি না হয়েই সেই পদক্ষেপের প্রয়োগটি প্রযোজ্য। এটি কোনও পার্সিং ত্রুটির সাধারণ ধারণায় এম্বেড হয় না, এটি কোনও প্লাগইন লোড করতে ব্যর্থ হওয়ার সাধারণ ধারণায় এম্বেড হয় না। এটি কোনও ফাইল লোড করার সুনির্দিষ্ট প্রসঙ্গে (কোনও ফাইল লোড করা এবং ব্যর্থ হওয়ার সংমিশ্রণ) এর মধ্যে এ জাতীয় ত্রুটিগুলির মুখোমুখি হওয়ার ধারণার মধ্যে এম্বেড রয়েছে। তাই সাধারণত আমি এটি দেখতে পেয়েছি, অসতর্কভাবে বলছি, catcher's
একটি নিক্ষিপ্ত ব্যতিক্রমের প্রতিক্রিয়ার হিসাবে কর্মের গতি নির্ধারণ করার দায়িত্ব হিসাবে (উদাহরণ: ব্যবহারকারীকে বিকল্পগুলির সাথে অনুরোধ জানানো), নয় thrower's
।
আরেকটি উপায় রাখুন, যে সাইটগুলি throw
ব্যতিক্রমগুলি সাধারণত এই ধরণের প্রাসঙ্গিক তথ্যের অভাব হয়, বিশেষত যদি ফেলে দেওয়া ফাংশনগুলি সাধারণত প্রযোজ্য হয়। এমনকি যখন তাদের কাছে এই তথ্য থাকে তখন পুরোপুরি ডিজেনারালাইজড প্রসঙ্গেও আপনি এটিকে এম্বেড করে throw
সাইটে পুনরুদ্ধারের আচরণের দিক থেকে নিজেকে কোণঠাসা করে নিন । যে সাইটগুলি সেই catch
ক্রিয়াকলাপ নির্ধারণের জন্য সাধারণত সর্বাধিক পরিমাণে তথ্য উপলব্ধ থাকে এবং সেই প্রদত্ত লেনদেনের জন্য যদি সেই ক্রিয়াকলাপটি কখনও পরিবর্তিত হয় তবে আপনাকে সংশোধন করার জন্য একটি কেন্দ্রীয় জায়গা দেয়।
আপনি যখন ব্যতিক্রমগুলি ছড়িয়ে দেওয়ার চেষ্টা করছেন তখন আর কী ভুল তা রিপোর্ট না করে তবে কী করবেন তা নির্ধারণের চেষ্টা করছেন, এটি আপনার কোডের সাধারণতা এবং নমনীয়তাকে হ্রাস করতে পারে। একটি বিশ্লেষণ ত্রুটি সবসময় এই ধরণের প্রম্পটে আনা উচিত নয়, এটি এমন প্রেক্ষাপটে পরিবর্তিত হয় যেখানে এইরকম ব্যতিক্রম ছুঁড়ে দেওয়া হয় (যে লেনদেনের অধীনে এটি নিক্ষেপ করা হয়েছিল)।
অন্ধ থ্রোবার
কেবল সাধারণভাবে, ব্যতিক্রম হ্যান্ডলিংয়ের অনেকগুলি নকশা প্রায়শই একজন অন্ধ থ্রোয়ারের ধারণার চারদিকে ঘোরে। এটি ব্যতিক্রম কীভাবে ধরা পড়বে, বা কোথায় তা জানে না। একই ম্যানুয়াল ত্রুটি প্রচার প্রচার করে এমনকি পুরানো ফর্ম ত্রুটি পুনরুদ্ধারের জন্য প্রযোজ্য। যে সাইটগুলিতে ত্রুটির মুখোমুখি হয় সেগুলিতে কোনও ব্যবহারকারীর পাঠ্যক্রম অন্তর্ভুক্ত থাকে না, তারা কী ধরণের ত্রুটি দেখা দিয়েছে তা জানাতে কেবল ন্যূনতম তথ্য এম্বেড করে।
উল্টানো দায়িত্ব এবং ক্যাচারকে সাধারণীকরণ করা
আরও যত্ন সহকারে এ সম্পর্কে চিন্তাভাবনা করার সময়, আমি কী ধরণের কোডবেস কল্পনা করার চেষ্টা করছিলাম যেখানে এটি প্রলোভন হতে পারে। আমার কল্পনা (সম্ভবত ভুল) হ'ল আপনার দলটি এখনও এখানে "ভোক্তা" এর ভূমিকা পালন করছে এবং বেশিরভাগ কলিং কোড বাস্তবায়ন করছে। সম্ভবত আপনার কাছে প্রচুর বৈচিত্র্যময় লেনদেন (প্রচুর try
ব্লক) রয়েছে যা সমস্ত ত্রুটিগুলির একই সেটগুলিতে চলে যেতে পারে এবং সমস্তকে একটি ডিজাইনের দৃষ্টিকোণ থেকে পুনরুদ্ধারের ক্রিয়াকলাপের অভিন্ন কোর্সে নিয়ে যাওয়া উচিত।
Lightness Races in Orbit's
সূক্ষ্ম উত্তরের (যা আমি সত্যই একটি উন্নত গ্রন্থাগার-ভিত্তিক মানসিকতা থেকে এসেছি) থেকে বুদ্ধিমান পরামর্শ বিবেচনা করে , আপনি এখনও "কি করবেন" ব্যতিক্রম কেবলমাত্র লেনদেন পুনরুদ্ধারের সাইটের কাছাকাছি নিক্ষেপ করার জন্য প্রলুব্ধ হতে পারেন।
এখান থেকে একটি মধ্যস্থতাকারী, সাধারণ লেনদেন-হ্যান্ডলিং সাইট খুঁজে পাওয়া সম্ভব হতে পারে যা প্রকৃতপক্ষে "কী করতে হবে" উদ্বেগকে কেন্দ্রবিন্দু করে কিন্তু তবুও ধরার প্রসঙ্গে।
এটি কেবল তখনই প্রযোজ্য যখন আপনি কোনও ধরণের সাধারণ ফাংশন ডিজাইন করতে পারেন যা এই সমস্ত বাহ্যিক লেনদেন ব্যবহার করে (উদা: একটি ফাংশন যা কল করার জন্য অন্য কোনও ফাংশন সরবরাহ করে বা এই মধ্যবর্তী লেনদেন সাইটের মডেলিং করে মধ্যস্থতার আচরণের সাথে একটি বিমূর্ত লেনদেন বেস শ্রেণীর কাজ করে যা পরিশীলিত ক্যাচিং করে does )।
তবুও যে কেউ বিভিন্ন সম্ভাব্য ত্রুটির প্রতিক্রিয়া হিসাবে ব্যবহারকারীর ক্রিয়াকেন্দ্রকে কেন্দ্রীভূত করার জন্য দায়ী হতে পারে, এবং এখনও ছোঁড়ার পরিবর্তে ধরার প্রসঙ্গে। সাধারণ উদাহরণ (পাইথন-ইশ সিডোকোড, এবং আমি সামান্যতম ক্ষেত্রেই পাইথন বিকাশকারী নই তাই এরকম আরও বেশি বুদ্ধিমান উপায় থাকতে পারে):
def general_catcher(task):
try:
task()
except SomeError1:
# do some uniformly-designed recovery stuff here
except SomeError2:
# do some other uniformly-designed recovery stuff here
...
[আশা করি এর চেয়ে আরও ভাল নামের সাথে general_catcher
] এই উদাহরণস্বরূপ, আপনি কোন কার্য সম্পাদন করতে পারেন এমন একটি ফাংশনটিতে পাস করতে পারেন তবে আপনার আগ্রহী সমস্ত ধরণের ব্যতিক্রমগুলির জন্য সাধারণ / একীভূত ক্যাচ আচরণ থেকে এখনও উপকৃত হতে পারেন এবং "কী করবেন" অংশটি সমস্ত প্রসারিত বা সংশোধন করে চালিয়ে যেতে পারেন আপনি এই কেন্দ্রীয় অবস্থান থেকে পছন্দ করেন এবং এখনও একটি catch
প্রসঙ্গের মধ্যে যেখানে এটি সাধারণত উত্সাহিত করা হয়। সর্বোপরি, আমরা "কী করণীয়" ("অন্ধ ছোঁড়া" ধারণাটি সংরক্ষণ করে) নিক্ষেপকারী সাইটগুলিকে নিজেদের থেকে বিরত রাখতে পারি।
যদি আপনি এই পরামর্শগুলির কোনও এখানে সহায়ক না পেয়ে থাকেন এবং যাইহোক যাইহোক "কী করবেন" ব্যতিক্রম করার প্রবল প্রলোভন রয়েছে তবে প্রধানত সচেতন থাকবেন যে এটি খুব কমপক্ষে খুব বিদ্বেষমূলক, পাশাপাশি সম্ভাব্যরূপে একটি সাধারণ মানসিকতাকে নিরুৎসাহিত করছে।