উদ্দেশ্য হিসাবে ক্যাচ ব্যবহার ব্যতিক্রম উত্থাপন


10

if...elseব্যতিক্রম হ্যান্ডলিং দিয়ে মোড়ানো একটি আদর্শের জন্য , কোডের সদৃশতা এড়ানোর জন্য নীচের উদাহরণের মতো কোনও প্রস্তাবিত অনুশীলন?

try
{
    if (GetDataFromServer())
    {
        return ProcessData();
    }
    else
    {
        throw new Exception();
    }
catch(Exception ex)
{
    return null;
}

পরিবর্তে...

try
{
    if (GetDataFromServer())
    {
        return ProcessData();
    }
    else
    {
        return null;
    }
}
catch(Exception ex)
{
    return null;
}

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


যদি পদ্ধতিটি যথেষ্ট ছোট হয় তবে আমি অন্যটি সরিয়ে ফেলব এবং ট্রাইচ্যাচ ব্লকের বাইরে নাল ফিরিয়ে দেব যাতে আমাকে কেবল একবার নাল ফিরে আসতে হবে।
ফ্যাবিও মার্কোলিনি

উত্তর:


12

প্রবাহ নিয়ন্ত্রণের জন্য ব্যতিক্রম হ্যান্ডলিং ব্যবহার করা মাইক্রোসফ্ট দ্বারা নিরুৎসাহিত করা হয়।

এবং বিষয়টিতে একটি গোল টেবিল পাওয়া যায়।

বলা হচ্ছে, সি # এটি করা সমর্থন করে এবং আমি মনে করি এটি কোনও ব্যতিক্রমই সবচেয়ে উপযুক্ত প্রতিক্রিয়া কিনা তা নির্ভর করে এমন অবস্থার উপর নির্ভর করে।


1
এটি আমাকে আঘাত করে যে এই ধরণের জিনিসটি ইভেন্টগুলি ব্যবহার না করার জন্য সত্যিকারের চেষ্টা করছে।
র‌্যাডরবব

@ রেডারবব: এর সাথে ইভেন্টগুলি কীভাবে সম্পর্কিত?

@ গ্রোভএনএল - ক্যাচ ব্লকে একটি নির্দিষ্ট পদ্ধতিতে কল করতে একটি নির্দিষ্ট পয়েন্টে একটি ব্যতিক্রম ছুঁড়ে দেওয়া? Quacks আমার কাছে একটি ইভেন্টের মত।
রডারবব

@ রেডারবব: এটি কোনও ইভেন্ট নয়। উত্তরের গোলটেবিল লিঙ্কে আলোচিত হিসাবে এখানে প্রচুর নমুনা ব্যবহারের মামলা রয়েছে।

1
@radarbob মাত্র কিছুটা স্পষ্টকরণ, ব্যতিক্রমকে কলারকে সিগন্যাল করার একটি উপায় হিসাবে তৈরি করা হয়েছিল যে এমন কিছু ঘটেছে যা ডাকা পদ্ধতিটি পরিচালনা করতে অক্ষম। তবে, একটি ইভেন্ট অবশ্যই শোনা উচিত। একটি ব্যতিক্রম হ'ল একটি প্রোগ্রামের স্বাভাবিক প্রবাহের বাধ্যতামূলক বাধা। একটি অনাবৃত ব্যতিক্রম পুরো অ্যাপ্লিকেশনটি স্থগিত করে দেবে।

6

পারফরম্যান্স হিট সম্ভবত সবচেয়ে নগন্য, এই উত্তর হিসাবে ব্যাখ্যা করা হয়েছে ।

সুতরাং আসুন ধারণাটি নিয়ে চলুন যে পারফরম্যান্স কোনও সমস্যা নয়। আপনি নিক্ষেপ করছি System.Exception, শুধু মধ্যে সঞ্চালনের সরাতে catchদফা । একটি নিক্ষেপ BadControlFlowThatShouldBeRewrittenExceptionসম্ভবত অত্যধিক কিল হবে।

আসুন এটি ভেঙে দিন। আমাদের আছে:

  • পদ্ধতি GetDataFromServer(পদ্ধতির নামগুলি সি # তে পাস্কেলকেস হওয়া উচিত), যা সম্ভবত একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারে বা এটিকে ফেরত দিতে পারে bool
  • যদি ফলাফল হয় true, চালান ProcessData
  • nullঅন্যথায় ফিরে আসুন ।

এই কোডটি যে পদ্ধতিতে লিখিত হয়েছে তার মতো দেখে মনে হচ্ছে খুব সহজেই অনেক কিছু করা হচ্ছে। ডিজাইনের ত্রুটির মতো দেখতে GetDataFromServerফিরে আসার জন্য bool, আমি সেই পদ্ধতিটি সার্ভার থেকে প্রাপ্ত ডেটা ফিরিয়ে আনার প্রত্যাশা করছিলাম , এমন কয়েকটি IEnumerable<SomeType>যাতে 0 বা ততোধিক আইটেম থাকবে - যেমন খুশির পথে এন আইটেমগুলি ফিরে আসে যেখানে এন> 0 , তেমন খুশি নয় পাথ 0 টি আইটেম ফিরিয়ে দেয় এবং অসুখী পথটি অবিচ্ছিন্ন ব্যতিক্রমের সাথে প্রবাহিত হয়, যাই হোক না কেন।

পদ্ধতিটি দেখতে দেখতে বেশ কিছুটা বদলে যায় - এটি আবার বোঝা শক্ত যে এটির অর্থ বোঝে কি না, কারণ মূল পোস্টটিতে কেবল একটি প্রস্থান পয়েন্ট থাকে (এবং এইভাবে সমস্ত কোড পাথ কোনও মান ফেরায় না বলে সংকলন করে না ), তাই এটি কেবল একটি বন্য অনুমান:

try
{
    var result = GetDataFromServer();
    return ProcessData(result);
}
catch
{
    return null;
}

এখানে আপনি ProcessDataএটি দেখতে এবং দেখতে পাচ্ছেন যে এটিটি পুনরাবৃত্তি করছে resultএবং nullএর মধ্যে কোনও আইটেম না থাকলে ফিরে আসে IEnumerable

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

একটি সাধারণ catchধারা সহ যা ব্যতিক্রম ক্যাপচার করে না, কোনও কিছুর নির্ণয় করা বেশ শক্ত হয়ে যায়। আমি পরিবর্তে নূন্যতম এটি করতে চাই:

catch(Exception e)
{
    return null;
}

eযদি আপনি কিছু ভুল হয়ে যায় তবে আপনি এখন অন্তত বিরতি এবং পরীক্ষা করতে পারেন।


টিএল; ডিআর : না, প্রবাহ নিয়ন্ত্রণের জন্য ব্যতিক্রম ছোঁড়া এবং ধরা ভাল ধারণা নয়।


এই উত্তরটি দেখায় যে আমি কেন আমার কোডটি জেনেরিক রাখার চেষ্টা করেছি: আমি আমার কোডটিতে যে প্রতিটা ব্যতিক্রম করেছি তা আমি তালিকাভুক্ত করতে চাইনি; আমি প্রকৃত পদ্ধতির নাম তালিকা করতে চাইনি; আমি পদ্ধতি ঘোষণার তালিকা করতে চাইনি; আমি সিনট্যাক্সের পরামর্শ চাইনি। প্রবাহ নিয়ন্ত্রণের জন্য ব্যতিক্রম ছোঁড়া ঠিক আছে কিনা তা নিয়ে আমার একক প্রশ্ন ছিল, যার তাত্ক্ষণিক উত্তর বি 2 কে দিয়েছিল was আমি মেটা নিয়ে এই নিয়ে বিতর্ক করে খুশি হব।

3
এরকম শব্দগুলি তখন প্রোগ্রামারদের জন্য একটি প্রশ্ন হওয়া উচিত ছিল। আমরা কোড পর্যালোচনা করি, ধারণাগুলি নয়।
মালাচি

2

আপনার প্রথম উত্তরে একটি পারফরম্যান্স হিট আছে যা সেখানে থাকার দরকার নেই।

try
{
    if (GetDataFromServer())
    {
        return ProcessData();
    }
    else
    {
        throw new Exception();
    }
catch(Exception ex)
{
    return null;
}

ক্যাচ স্টেটমেন্টে প্রবেশের জন্য আপনি যখন আইএফ স্টেটমেন্টটি প্রস্থান করবেন তখন কোড স্যুইচ দিকনির্দেশনা তৈরি করতে হবে না, তাই বলে say

আপনি যদি return null; অন্য বিবৃতিতে এটি করতে চান তবে অন্য বিবৃতি থেকে ছোঁড়ার পরে ধরা পড়ার মতো নয়।

সম্ভবত আপনার রিয়েল কোডে প্রযোজ্য নয় , তবে আপনি যে জেনেরিক কোডটি দিয়েছিলেন তা প্রয়োগ হয়।

মানকগুলি বলছে যে আপনার এটি করা উচিত নয়।

মানকগুলি বলছে আপনার এটি করা উচিত, (আবার ওপিতে দেওয়া জেনেরিক কোডের ভিত্তিতে)

if (GetDataFromServer())
{
    return ProcessData();
}
else
{
    Return null
}

এবং যেহেতু আপনার কাছে ধরা হচ্ছে এমন কোনও নির্দিষ্ট ব্যতিক্রম আপনার কাছে নেই এখানে চেষ্টা করার চেষ্টাও করা উচিত নয়।

আপনি যখন ব্যতিক্রমগুলি ঘটে সেগুলি দেখতে চান যাতে আপনি ব্যতিক্রমটি তৈরি করে এমন সমস্যাটি ঠিক করতে পারেন।


1

এত সহজ কেন নয়:

if (!GetDataFromServer()) return null;
ProcessData();

যদি কোনও ব্যতিক্রম হ্যান্ডলার বিদ্যমান থাকে তবে এটি প্রসেসডাটাতে হওয়া উচিত ()


আমি কেন ProcessData()উপরের স্তরের মাধ্যমে ব্যতিক্রমগুলি পাস করতে চাই না ?
গ্রিভসএনএল

@ গ্রোভসএনএল এখানে ব্যাতিক্রম করে কিছুই কার্যকর হচ্ছে না।
লরেন পেচটেল

1
তা কিভাবে? যদি ProcessData()এখন একটি ব্যতিক্রম ছুঁড়ে ফেলে তবে এটি পরিচালনা করা হয় না। আমি নিজেই কোনও পরিবর্তন না করে কোনও ব্যতিক্রম ছুঁড়ে মারলে return nullএই স্তরে এটি চাই । ProcessData()ProcessData()
গ্রোভসএনএল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.