ব্যতিক্রম চেষ্টা করবে / অবশেষে (ক্যাচ ব্যতীত) বুবলি ব্যতিক্রম?


115

আমি প্রায় ইতিবাচক যে উত্তর হ্যাঁ। যদি আমি চেষ্টা করি অবশেষে ব্লক ব্যবহার করি তবে ক্যাচ ব্লকটি ব্যবহার না করে তবে কোনও ব্যতিক্রম বুদবুদ হবে। সঠিক?

সাধারণভাবে অনুশীলন সম্পর্কে কোন চিন্তা?

শেঠ

উত্তর:


130

হ্যাঁ, এটা একেবারে হবে। আপনার finallyব্লক ধরে নেওয়া অবশ্যই একটি ব্যতিক্রম ছুঁড়ে না, অবশ্যই, সেই ক্ষেত্রে যা মূলত নিক্ষিপ্ত হয়েছিল সেইটিকে কার্যকরভাবে "প্রতিস্থাপন" করবে।


13
@ ডেভিড: আপনি সি # তে শেষ অবধি ব্লক থেকে ফিরে আসতে পারবেন না।
জন স্কিটি

3
এমএসডিএন ডকুমেন্টেশনও এই উত্তরটির সত্যতা নিশ্চিত করে: বিকল্পভাবে, আপনি কল স্ট্যাকের উচ্চতর
ব্রডব্যান্ড

60

সাধারণভাবে অনুশীলন সম্পর্কে কোন চিন্তা?

হ্যাঁ. সতর্কতা অবলম্বন করা আবশ্যক । যখন আপনার অবশেষে অবরুদ্ধ চলছে, এটি সম্পূর্ণরূপে সম্ভব যে এটি চলছে because কারণ একটি নিয়ন্ত্রণহীন, অপ্রত্যাশিত ব্যতিক্রম ছুঁড়ে দেওয়া হয়েছে । মানে যে কিছু যে ভাঙ্গা এবং কিছু সম্পূর্ণরূপে অপ্রত্যাশিত ঘটছে যেতে পারে।

এই পরিস্থিতিতে এটি যুক্তিযুক্ত যে ক্ষেত্রে আপনার শেষ পর্যন্ত ব্লকগুলি কোড চালানো উচিত নয়। অবশেষে ব্লকের কোডটি ধরে নেওয়া যেতে পারে যে এটি নির্ভর করে যে সাবসিস্টেমগুলির উপর নির্ভর করে এটি স্বাস্থ্যকর, যখন বাস্তবে তারা গভীরভাবে ভেঙে যেতে পারে। শেষ অবধি কোডটি আরও খারাপ করতে পারে।

উদাহরণস্বরূপ, আমি প্রায়শই এই ধরণের জিনিস দেখতে পাই:

DisableAccessToTheResource();
try
{
    DoSomethingToTheResource();
}
finally
{
    EnableAccessToTheResource();
}

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

প্রথমত, উত্স অ্যাক্সেস কলার দ্বারা ইতিমধ্যে অক্ষম করা যেতে পারে; সেক্ষেত্রে এই কোডটি সম্ভবত অকাল পূর্বে এটি পুনরায় সক্ষম করে।

দ্বিতীয়ত, যদি ডসোমিংথিংটোর রিসোর্স একটি ব্যতিক্রম ছুঁড়ে, তবে উত্সটিতে অ্যাক্সেস সক্ষম করার জন্য সঠিক জিনিসটি কি ??? সংস্থানটি পরিচালনা করে এমন কোডটি অপ্রত্যাশিতভাবে ভেঙে গেছে । এই কোডটি বলছে, বাস্তবে "যদি ম্যানেজমেন্ট কোডটি ভাঙা হয় তবে নিশ্চিত হয়ে নিন যে অন্য কোডটি যত তাড়াতাড়ি সম্ভব সেই ভাঙা কোডটিকে কল করতে পারে, যাতে এটি ভয়াবহভাবে ব্যর্থও হতে পারে ।" এটি একটি খারাপ ধারণা বলে মনে হচ্ছে।

তৃতীয়ত, যদি ডসোমিংথিংটোর রিসোর্স একটি ব্যতিক্রম ছুঁড়ে ফেলেছে, তবে আমরা কীভাবে জানি যে সক্ষমের অ্যাক্সেসটোওআরসোর্স একটি ব্যতিক্রম ছুঁড়ে না ফেলে? রিসোর্সের ব্যবহার যা-ই হোক না কেন অসুবিধা ক্লিনআপ কোডকেও প্রভাবিত করতে পারে, সেক্ষেত্রে মূল ব্যতিক্রমটি নষ্ট হয়ে যাবে এবং সমস্যাটি নির্ণয় করা আরও কঠিন হবে।

আমি চেষ্টা করি অবশেষে ব্লকগুলি ব্যবহার না করে এই জাতীয় কোড লেখার প্রবণতা:

bool wasDisabled = IsAccessDisabled();
if (!wasDisabled)
    DisableAccessToTheResource();
DoSomethingToTheResource();
if (!wasDisabled)
    EnableAccessToTheResource();

এখন রাজ্যটির পরিবর্তন হওয়া দরকার না যতক্ষণ না দরকার। কলারের অবস্থা এখন গোলমাল নয়। এবং এখন, যদি ডোসোমিংথিংটোর রিসোর্স ব্যর্থ হয়, তবে আমরা অ্যাক্সেসটিকে পুনরায় সক্ষম করব না। আমরা ধরে নিই যে কোনও কিছু গভীরভাবে ভেঙে গেছে এবং চলমান কোড চালিয়ে যাওয়ার চেষ্টা করে পরিস্থিতি আরও খারাপ করার ঝুঁকি নেই। কলকারীরা যদি তারা পারেন তবে সমস্যাটি মোকাবেলা করুন।

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

দ্বিতীয়ত, আপনি যে সংস্থানটি পরিষ্কার করছেন তা হ'ল দুষ্প্রাপ্য সিস্টেমের সংস্থান। উদাহরণস্বরূপ, শেষ অবধি একটি ফাইল হ্যান্ডেল বন্ধ করা বুদ্ধিমান হয়ে যায়। (একটি "ব্যবহার করা" অবশ্যই চেষ্টা-অবরুদ্ধ ব্লকটি লেখার অন্য একটি উপায়)) ফাইলের বিষয়বস্তু দূষিত হতে পারে তবে আপনি এখনই এটি করতে পারবেন না। ফাইল হ্যান্ডেলটি শেষ পর্যন্ত বন্ধ হতে চলেছে, সুতরাং এটি পরে হওয়ার চেয়ে তাড়াতাড়ি হতে পারে।


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

Vb.net- এ, শেষ অবধি কোডটির পক্ষে কী ব্যতিক্রম মুলতুবি রয়েছে তা জানা সম্ভব। যদি কেউ "ব্যর্থ হয় না" পার্থক্য করার জন্য একটি ব্যতিক্রম শ্রেণিবিন্যাস স্থাপন করে; রাষ্ট্র অন্যথায় ঠিক আছে "থেকে" রাজ্যটি ভেঙে গেছে ", মুলতুবি ব্যতিক্রম খারাপগুলির মধ্যে একটি না হলে কেবল শেষ অবধি চলতে পারে। আমি ডিসপোজার / ক্লিনআপ রুটিনগুলি ব্যতিক্রমগুলি ধরতে এবং ডিসপোজারফয়েলডে এক্সসেপশন (যা "খারাপ" বিভাগে রয়েছে, এবং অভ্যন্তরীণ ধারণা হিসাবে মূল ব্যতিক্রম অন্তর্ভুক্ত করতে চাই) পছন্দ করি। আমি এটির সুবিধার্থে একটি ডিসপোজ (এক্সপেশন হিসাবে প্রাক্তন) সহ একটি স্ট্যান্ডার্ড আইডিস্পোজেবলেক্স ইন্টারফেস দেখতে চাই।
সুপারক্যাট

যদিও আমি প্রশংসা করি যে কোনও বিষয় খারাপ অবস্থাতে থাকলে এবং ক্লিনআপের চেষ্টা করার ফলে কোনও ব্যতিক্রম ঘটতে পারে সেগুলি আরও খারাপ করে দেবে বলে আমি মনে করি, সম্ভবত প্রতিনিধিদের সহায়তায় এই জাতীয় সমস্যাগুলি ক্লিনআপ কোডে পরিচালনা করা উচিত। একটি লক মোড়ক, উদাহরণস্বরূপ, একটি "চেকআইফসএফটোঅনলক (ব্যতিক্রম হিসাবে প্রাক্তন)" ফাংশন প্রতিনিধি প্রকাশ করতে পারে যা লক করা অবজেক্টটি কোনও অবৈধ অবস্থায় থাকলে এবং অন্যথায় সাফ হয়ে যায় এমন সময়ে সেট করা যায়। লকটি ছাড়ার আগে, মোড়কটি প্রতিনিধিটিকে পরীক্ষা করতে পারে; যদি খালি না থাকে, এটি এটি চালাতে পারে এবং লকটি সত্য হলেই মুক্তি দিতে পারে।
সুপারক্যাট

মোড়ক ব্যবহারের সাথে এ জাতীয় প্রতিনিধি ব্যবহারের ফলে যে কোডটি এতে বাধাগ্রস্ত হয় যদি সেই পদটি স্থিতি দ্বারা উপযুক্ত পরিষ্কার ব্যবস্থা নির্বাচন করতে মঞ্জুরি দেয় code এই জাতীয় পদক্ষেপের মধ্যে ডেটা কাঠামো মেরামত করা এবং সত্যটি ফিরে আসা, অন্য একটি "আরও তীব্র" ব্যতিক্রম ছুঁড়ে দেওয়া যেতে পারে যা আসলটিকে আবৃত করে, অথবা মিথ্যা প্রত্যাবর্তনের সময় আসল ব্যতিক্রমটিকে ঘূর্ণিত করে দেয় include
সুপারক্যাট

2
এরিক, আপনার দুর্দান্ত উত্তরের জন্য ধন্যবাদ। আমার ধারণা আমার দুটি প্রশ্ন করা উচিত ছিল কারণ আপনি এবং জন উভয়ই সঠিক। যাই হোক না কেন, আপনি upvated হয়। প্রশ্নের প্রতি আপনার মনোযোগের জন্য ধন্যবাদ।
শেঠ স্পিয়ারম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.