আপনি যেটিকে ধরা পড়েছেন বলে মনে হচ্ছে তা হ'ল কারও কেকের কাছে থাকার চেষ্টা করে এবং এটিও খাওয়ার চেষ্টা করার নির্দিষ্ট নরক।
আরআইআইআই এবং ব্যতিক্রমগুলি হাতে হাতে ডিজাইন করা হয়েছে। RAII যার দ্বারা আপনি না আছে অনেক লিখতে catch(...)
পরিষ্করণ করতে বিবৃতি। এটি অবশ্যই স্বয়ংক্রিয়ভাবে ঘটবে। এবং ব্যতিক্রমগুলি কেবলমাত্র RAII অবজেক্টের সাথে কাজ করার একমাত্র উপায়, কারণ নির্মাতারা কেবল সফল বা নিক্ষেপ করতে পারে (বা বস্তুটিকে একটি ত্রুটি অবস্থায় ফেলে দিতে পারে, তবে কে তা চায়?)।
একটি catch
বিবৃতি দুটি জিনিসের মধ্যে একটি করতে পারে: একটি ত্রুটি বা ব্যতিক্রমী পরিস্থিতি পরিচালনা করুন, বা ক্লিনআপ কাজ করুন। কখনও কখনও এটি উভয়ই করে তবে প্রতিটি catch
বিবৃতি এগুলির অন্তত একটি করতে উপস্থিত থাকে।
catch(...)
সঠিক ব্যতিক্রম হ্যান্ডলিং করতে অক্ষম। ব্যতিক্রম কী তা আপনি জানেন না; আপনি ব্যতিক্রম সম্পর্কে তথ্য পেতে পারেন না। একটি নির্দিষ্ট কোড ব্লকের মধ্যে কিছু দ্বারা ব্যতিক্রম ছুঁড়ে ফেলেছে তা ব্যতীত আপনার কাছে একেবারেই কোনও তথ্য নেই । এই জাতীয় ব্লকটিতে আপনি কেবল বৈধ কাজটি করতে পারেন তা হল ক্লিনআপ করা। এবং এর অর্থ ক্লিনআপ শেষে ব্যতিক্রমটি পুনরায় নিক্ষেপ করা।
ব্যতিক্রম পরিচালনার ক্ষেত্রে আরআইআই আপনাকে যা দেয় তা হ'ল ফ্রি ক্লিনআপ। যদি সমস্ত কিছু RAII যথাযথভাবে encapsulated হয়, তবে সবকিছু সঠিকভাবে পরিষ্কার করা হবে up catch
পরিষ্কার করার জন্য আপনার আর বিবৃতি দেওয়ার দরকার নেই । কোন ক্ষেত্রে catch(...)
বিবৃতি লেখার কোনও কারণ নেই ।
সুতরাং আমি সম্মত হবো যে catch(...)
বেশিরভাগই অশুভ ... অস্থায়ীভাবে ।
এই বিধানটি আরআইআইয়ের যথাযথ ব্যবহার হচ্ছে। এটা ছাড়া হওয়ায়, প্রয়োজন নির্দিষ্ট পরিষ্করণ কাজ করতে সক্ষম হবে। এর আশেপাশে কোনও লাভ নেই; আপনি ক্লিনআপ কাজ করতে সক্ষম হতে হবে। আপনাকে এটি নিশ্চিত করতে সক্ষম হতে হবে যে একটি ব্যতিক্রম ছুঁড়ে দেওয়া কোডটি যুক্তিসঙ্গত অবস্থায় ফেলে দেবে। এবং catch(...)
এটি করার একটি গুরুত্বপূর্ণ হাতিয়ার।
অপরটি ছাড়া আপনার থাকতে পারে না। আপনি এটি বলতে পারবেন না যে উভয়ই আরআইআই এবং catch(...)
খারাপ। এর মধ্যে আপনার অন্তত একটি প্রয়োজন; অন্যথায়, আপনি নিরাপদ ব্যতিক্রম না।
অবশ্যই, এর একটি বৈধ-যদিও-বিরল ব্যবহার catch(...)
যা এমনকি আরআইআই নিষিদ্ধ করতে পারে না: exception_ptr
অন্য কারও কাছে ফরোয়ার্ড পাওয়ার জন্য। সাধারণত একটি promise/future
বা অনুরূপ ইন্টারফেসের মাধ্যমে ।
আমার সহকর্মীরা বলেছেন যে আপনার সর্বদা জানা উচিত যে কোন ব্যতিক্রমগুলি নিক্ষেপ করা হবে এবং আপনি সর্বদা এই জাতীয় নির্মাণ ব্যবহার করতে পারেন:
আপনার সহকর্মী একজন নির্বোধ (বা কেবল ভয়ঙ্করভাবে অজ্ঞ)। আপনার লিখিতকরণের পরামর্শ দেওয়ার জন্য তিনি কতটা অনুলিপি-পেস্ট কোডের কারণে তা অবিলম্বে স্পষ্ট হওয়া উচিত। সেই ধরা বিবৃতি প্রত্যেকের জন্য পরিষ্করণ হতে হবে ঠিক একই । এটি একটি রক্ষণাবেক্ষণ দুঃস্বপ্ন, পাঠযোগ্যতার উল্লেখ না করা।
সংক্ষেপে: এই সমস্যাটিই আরএআইআই সমাধান করার জন্য তৈরি করা হয়েছিল (এটি অন্যান্য সমস্যা সমাধান করে না এমন নয়)।
এই ধারণাটি সম্পর্কে আমাকে যা বিভ্রান্ত করে তা হ'ল বেশিরভাগ লোকেরা যেভাবে যুক্তি দেয় যে রাইআইআই খারাপ এটির পিছনে সাধারণত wards সাধারণত, যুক্তিটিতে যায় "আরএআইআইটি খারাপ কারণ আপনাকে কনস্ট্রাক্টর ব্যর্থতার সংকেত দিতে ব্যতিক্রমগুলি ব্যবহার করতে হবে But তবে আপনি ব্যতিক্রমগুলি ছুঁড়তে পারবেন না, কারণ এটি নিরাপদ নয় এবং catch
সবকিছু পরিষ্কার করার জন্য আপনাকে প্রচুর বিবৃতি দিতে হবে।" যা একটি ভাঙা যুক্তি কারণ RAII যে সমস্যাটি RAII এর অভাব সৃষ্টি করে তা সমাধান করে।
সম্ভবত আরও বেশি, তিনি আরএআইআইয়ের বিপক্ষে কারণ এটি বিবরণ গোপন করে। ডিস্ট্রাক্টর কলগুলি স্বয়ংক্রিয় ভেরিয়েবলগুলিতে তত্ক্ষণাত দৃশ্যমান হয় না। সুতরাং আপনি এমন কোড পান যা পুরোপুরি কল করে called কিছু প্রোগ্রামার সত্যই তা ঘৃণা করে। স্পষ্টতই, যেখানে তারা মনে করেন যে 3 টি catch
স্টেটমেন্ট রয়েছে তারা সকলেই কপি-পেস্ট কোডের সাথে একই জিনিসটি করা একটি ভাল ধারণা।
...
আমার কি ধরা উচিত" সম্পর্কে আরও বেশি, যখন আমার প্রশ্নটি "আমাকে আরও ভাল করে ধরা উচিত...
বা<specific exception>
পুনর্নির্মাণের আগে"