এটি সংস্থান-সংস্থান পদ্ধতির চেষ্টা করেও কেন এই সতর্কতাগুলি উপস্থিত থাকতে পারে তার একটি ধারণাগত জবাব হতে চলেছে। দুর্ভাগ্যক্রমে এটি যে সহজ ধরণের সমাধান আপনি আশা করতে পারেন তা সহজ নয় not
ত্রুটি রিকভারি ব্যর্থ হতে পারে না
finally
কোনও লেনদেন সফল হয় বা ব্যর্থ হয় নির্বিশেষে নির্বাহ করা হয় এমন একটি লেনদেনের পরে নিয়ন্ত্রণ প্রবাহকে মডেল করে।
ব্যর্থ ক্ষেত্রে, এটি সম্পূর্ণরূপে সেরে ওঠার আগে (আমরা আমাদের গন্তব্যে পৌঁছানোর আগে ) কোনও ত্রুটি থেকে পুনরুদ্ধারের মাঝখানেfinally
মৃত্যুদন্ড কার্যকর করা যুক্তিটি ক্যাপচার করে ।catch
কোনও ত্রুটি থেকে পুনরুদ্ধারের মাঝামাঝি একটি ত্রুটির মুখোমুখি হওয়ার জন্য এটি যে ধারণামূলক সমস্যাটি উপস্থাপন করে তা কল্পনা করুন ।
একটি ডাটাবেস সার্ভারের কল্পনা করুন যেখানে আমরা কোনও লেনদেন করার চেষ্টা করছি এবং এটি অর্ধেকটা ব্যর্থ হয়ে গেছে (বলুন সার্ভারটি মাঝখানে স্মৃতিশক্তি হারিয়েছে)। এখন সার্ভারটি লেনদেনটিকে এমন বিন্দুতে ফিরিয়ে আনতে চায় যেন কিছুই হয়নি। তবুও কল্পনা করুন এটি পিছনে ঘূর্ণায়মান প্রক্রিয়ায় আরও একটি ত্রুটির মুখোমুখি। এখন আমরা ডাটাবেসে অর্ধ-প্রতিশ্রুতিবদ্ধ লেনদেন শেষ করি - লেনদেনের পারমাণবিকতা এবং অবিভাজ্য প্রকৃতি এখন ভেঙে গেছে, এবং ডাটাবেসের অখণ্ডতা এখন আপস করা হবে।
এই ধারণাগত সমস্যা কোন ভাষায় বিদ্যমান ত্রুটিযুক্ত পুলিশ কিনা ম্যানুয়াল ত্রুটি কোড প্রসারণ সঙ্গে এটি এর সি, বা সি ++ ব্যতিক্রম এবং destructors, অথবা ব্যতিক্রম এবং জাভা সঙ্গে finally
।
finally
যে ভাষাগুলি এগুলিকে একইভাবে সরবরাহ করে তাতে ব্যর্থতা ঘটতে পারে না ব্যতিক্রমগুলির মুখোমুখি হওয়ার প্রক্রিয়ায় ডেস্ট্রাক্টররা সি ++ এ ব্যর্থ হতে পারে না।
এই ধারণাগত এবং কঠিন সমস্যা এড়ানোর একমাত্র উপায় হ'ল নিশ্চিত করা যে লেনদেনকে ফিরিয়ে আনার এবং মাঝখানে রিসোর্সগুলি ছাড়ার প্রক্রিয়াটি সম্ভবত পুনরাবৃত্ত ব্যতিক্রম / ত্রুটির মুখোমুখি হতে পারে না।
সুতরাং এখানে একমাত্র নিরাপদ নকশা এমন একটি নকশা যেখানে writer.close()
সম্ভবত ব্যর্থ হতে পারে না। নকশায় সাধারণত দৃশ্যগুলি এড়ানোর উপায় রয়েছে যেখানে এই জাতীয় জিনিসগুলি পুনরুদ্ধারের মাঝে ব্যর্থ হতে পারে, এটি অসম্ভব করে তোলে।
দুর্ভাগ্যক্রমে এটি একমাত্র উপায় - ত্রুটি পুনরুদ্ধার ব্যর্থ হতে পারে না। এটির সুনিশ্চিত করার সহজ উপায় হ'ল এই ধরণের "রিসোর্স রিলিজ" এবং "বিপরীত পার্শ্ব প্রতিক্রিয়া" ফাংশনগুলি ব্যর্থ হওয়ার পক্ষে অক্ষম করে তোলা। এটি সহজ নয় - যথাযথ ত্রুটি পুনরুদ্ধার কঠিন এবং দুর্ভাগ্যক্রমে পরীক্ষা করাও শক্ত। তবে এটি অর্জনের উপায় হ'ল এটি নিশ্চিত করা যে কোনও "ফাংশন" ধ্বংস "," বন্ধ "," শাটডাউন "," রোল ব্যাক "ইত্যাদির ফলে প্রক্রিয়াটিতে সম্ভবত কোনও বাহ্যিক ত্রুটি দেখা দিতে পারে না, কারণ এই ধরনের ফাংশনগুলি প্রায়শই প্রয়োজন একটি বিদ্যমান ত্রুটি থেকে পুনরুদ্ধার মাঝখানে ডাকা হবে।
উদাহরণ: লগিং
ধরা যাক আপনি একটি finally
ব্লকের ভিতরে স্টাফ লগ করতে চান । লগিং ব্যর্থ না হতে পারে এটি প্রায়শই একটি বিশাল সমস্যা হতে চলেছে । লগ ইন করা প্রায়শই ব্যর্থ হতে পারে, যেহেতু এটি ফাইলটিতে আরও ডেটা যুক্ত করতে পারে এবং এটি ব্যর্থ হওয়ার অনেকগুলি কারণ সহজেই খুঁজে পেতে পারে।
সুতরাং সমাধানটি এখানে এটি তৈরি করা যাতে finally
ব্লকগুলিতে ব্যবহৃত কোনও লগিং ফাংশন কলারের কাছে নিক্ষেপ করতে পারে না (এটি ব্যর্থ হতে পারে তবে এটি নিক্ষেপ করবে না)। আমরা কীভাবে এটি করতে পারি? যদি আপনার ভাষা অবশেষে সরবরাহের প্রেক্ষাপটে নিক্ষেপ করার অনুমতি দেয় তবে একটি ব্যর্থতা গ্রাস করে এবং ত্রুটি কোডগুলিতে পরিণত করে কলারের কাছে নিক্ষেপ করা এড়ানো এক উপায় হতে পারে, যেমন লগিং আলাদাভাবে করা যেতে পারে প্রক্রিয়া বা থ্রেড যা পৃথকভাবে এবং বিদ্যমান ত্রুটি-পুনরুদ্ধারের স্ট্যাকের আনইন্ডিংয়ের বাইরে পৃথকভাবে ব্যর্থ হতে পারে। ততক্ষণ আপনি কোনও প্রক্রিয়াটি কোনও ত্রুটির দিকে চালিত হওয়ার সম্ভাবনা ছাড়াই যোগাযোগ করতে পারবেন, এটি ব্যতিক্রম-নিরাপদও হবে, কারণ আমরা যদি একই থ্রেডের মধ্য থেকে পুনরাবৃত্তি করে ছুঁড়ে ফেলি তবে সুরক্ষা সমস্যাটি কেবল এই দৃশ্যেই উপস্থিত রয়েছে since।
এই ক্ষেত্রে, লগিং ব্যর্থতা দিয়ে আমরা দূরে সরে যেতে পারি তবে শর্ত থাকে যে এটি লগ করতে ব্যর্থ হয়েছে এবং কিছুই না করে বিশ্বের শেষ নয় (এটি কোনও সংস্থান ফাঁস করে না বা পার্শ্ব প্রতিক্রিয়াগুলি ব্যর্থ করতে ব্যর্থ হয়, যেমন)।
যাইহোক, আমি নিশ্চিত যে আপনি ইতিমধ্যে ধারণা করতে শুরু করতে পারেন যে কোনও সফ্টওয়্যারকে সত্যিকারের ব্যতিক্রম-নিরাপদ করা সত্যিই কত অবিশ্বাস্যরকম কঠিন। এটি সর্বাধিক মিশন-সমালোচনামূলক সফ্টওয়্যার ছাড়া সম্পূর্ণ ডিগ্রীতে সন্ধানের প্রয়োজন হবে না। তবে কীভাবে সত্যিকারের ব্যতিক্রম-সুরক্ষা অর্জন করা যায় তা লক্ষ করা মূল্যবান, যেহেতু খুব সাধারণ-উদ্দেশ্যমূলক লাইব্রেরি লেখকরা প্রায়শই এখানে ভ্রষ্ট হন এবং গ্রন্থাগারটি ব্যবহার করে আপনার অ্যাপ্লিকেশনটির পুরো ব্যতিক্রম-সুরক্ষা নষ্ট করে দেন।
SomeFileWriter
যদি SomeFileWriter
ভিতরে ফেলে দিতে পারে close
, তবে আমি বলব যে এটি ব্যতিক্রম হ্যান্ডলিংয়ের সাথে সাধারণত বেমানান, যদি না আপনি কোনও ব্যতিক্রম থেকে পুনরুদ্ধার জড়িত এমন প্রসঙ্গে কখনও এটি বন্ধ করার চেষ্টা না করেন। যদি এর জন্য কোডটি আপনার নিয়ন্ত্রণের বাইরে থাকে তবে আমরা এসএল হতে পারি তবে এই নির্লজ্জ ব্যতিক্রম-সুরক্ষা ইস্যুটির লেখককে অবহিত করা উচিত। এটি যদি আপনার নিয়ন্ত্রণের মধ্যে থাকে তবে আমার মূল সুপারিশটি হ'ল এটি নিশ্চিত করা যে এটি প্রয়োজনীয়ভাবে কোনওভাবেই ব্যর্থ হতে পারে না।
কল্পনা করুন যে কোনও অপারেটিং সিস্টেম আসলে কোনও ফাইল বন্ধ করতে ব্যর্থ হতে পারে। এখন যে কোনও প্রোগ্রাম যা শাট ডাউন করার সময় কোনও ফাইল বন্ধ করার চেষ্টা করে সেটি বন্ধ করতে ব্যর্থ হবে । আমাদের এখন কী করা উচিত, কেবল অ্যাপ্লিকেশনটি খোলা রাখুন এবং লিম্বোতে রাখবেন (সম্ভবত নেই), কেবল ফাইল রিসোর্স ফাঁস করুন এবং সমস্যাটিকে উপেক্ষা করুন (সম্ভবত ঠিক আছে যদি এটি এতটা সমালোচনা না করে)? সবচেয়ে নিরাপদ নকশা: এটি তৈরি করুন যাতে কোনও ফাইল বন্ধ করতে ব্যর্থ হওয়া অসম্ভব।