নিয়মিত প্রবাহ নিয়ন্ত্রণ হিসাবে ব্যতিক্রম ব্যবহার করবেন না কেন?


192

গুগল করা যেতে পারে এমন সমস্ত স্ট্যান্ডার্ড-উত্তরগুলি এড়াতে, আমি এমন একটি উদাহরণ দেব যা আপনি সকলেই ইচ্ছামত আক্রমণ করতে পারেন।

C # এবং জাভা (এবং খুব অনেকে) ধরনের 'ওভারফ্লো আচরণ কিছু আমি এ সব পছন্দ না প্রচুর সঙ্গে আছে (যেমন type.MaxValue + type.SmallestValue == type.MinValueউদাহরণস্বরূপ: int.MaxValue + 1 == int.MinValue)।

তবে, আমার জঘন্য প্রকৃতিটি দেখেছি, আমি এই আচরণটি প্রসারিত করে এই আঘাতটিতে কিছুটা অপমান যুক্ত করব, আসুন একটি ওভাররাইড DateTimeটাইপ বলি । (আমি জানি DateTime। নেট এ সিল করা আছে, তবে এই উদাহরণের জন্য, আমি সিউডো ভাষা ব্যবহার করছি যা সি # এর মতো হ'ল, ডেটটাইম সিল না করা ব্যতীত)।

ওভাররাইড Addপদ্ধতি:

/// <summary>
/// Increments this date with a timespan, but loops when
/// the maximum value for datetime is exceeded.
/// </summary>
/// <param name="ts">The timespan to (try to) add</param>
/// <returns>The Date, incremented with the given timespan. 
/// If DateTime.MaxValue is exceeded, the sum wil 'overflow' and 
/// continue from DateTime.MinValue. 
/// </returns>
public DateTime override Add(TimeSpan ts) 
{
    try
    {                
        return base.Add(ts);
    }
    catch (ArgumentOutOfRangeException nb)
    {
        // calculate how much the MaxValue is exceeded
        // regular program flow
        TimeSpan saldo = ts - (base.MaxValue - this);
        return DateTime.MinValue.Add(saldo)                         
    }
    catch(Exception anyOther) 
    {
        // 'real' exception handling.
    }
}

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

আমি মনে করি অনেক ক্ষেত্রে তারা যদি স্ট্রাকচারের চেয়ে আরও স্পষ্ট হয় এবং পদ্ধতিটি যে চুক্তি করছে তাতে কোনও চুক্তি ভঙ্গ করে না।

প্রত্যেককে মনে হয় “নিয়মিত প্রোগ্রাম প্রবাহের জন্য এগুলি কখনই ব্যবহার করবেন না” এমন প্রতিক্রিয়া প্রত্যেকের মনে হয় যে প্রতিক্রিয়াটির শক্তিটি ন্যায়সঙ্গত করতে পারে হিসাবে এটি এত সুন্দরভাবে অন্তর্নির্মিত নয়।

নাকি আমি ভুল করছি?

আমি অন্যান্য পোস্টগুলি পড়েছি, সমস্ত ধরণের বিশেষ ক্ষেত্রে মোকাবেলা করেছি, তবে আমার বক্তব্যটি হ'ল আপনি উভয়ই হ'ল এতে কোনও ভুল নেই:

  1. স্পষ্ট
  2. আপনার পদ্ধতির চুক্তিকে সম্মান করুন

আমাকে গুলি করো.


2
+1 আমিও একইভাবে অনুভব করি। পারফরম্যান্সের পাশাপাশি-নিয়ন্ত্রণ-প্রবাহ ব্যতিক্রমগুলি এড়ানোর একমাত্র ভাল কারণটি যখন কলার কোডটি রিটার্ন মানগুলির সাথে আরও অনেক বেশি পাঠযোগ্য হয়।

4
এটি কি: কিছু ঘটলে রিটার্ন -1, অন্য কিছু হলে ফিরুন -2 ... সত্যিই আরও পাঠযোগ্য তবে ব্যতিক্রম?
কিন্ডার

1
সত্য যে দুঃখের সাথে একজন নেতিবাচক খ্যাতি পান: আপনার বক্তব্যটি যদি বিবৃতি দিয়ে লেখা যায় না তবে। (এটি একে সঠিক / সম্পূর্ণ বলা উচিত নয়))
ইনগো

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

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

উত্তর:


169

আপনি কি কখনও কার্যক্রমের সাধারণ কোর্সে প্রতি সেকেন্ডে পাঁচটি ব্যতিক্রম উত্সাহিত করার কোনও প্রোগ্রাম ডিবাগ করার চেষ্টা করেছেন?

আমার আছে.

প্রোগ্রামটি বেশ জটিল ছিল (এটি একটি বিতরণ করা গণনা সার্ভার ছিল), এবং প্রোগ্রামের একপাশে সামান্য পরিবর্তন সহজেই পুরোপুরি ভিন্ন জায়গায় কিছু ভাঙ্গতে পারে।

আমি আশা করি আমি কেবল প্রোগ্রামটি চালু করতে পারতাম এবং ব্যতিক্রমগুলি ঘটে যাওয়ার জন্য অপেক্ষা করতে পারতাম, তবে অপারেশনগুলির স্বাভাবিক কোর্সে শুরু হওয়ার সময় প্রায় 200 ব্যতিক্রম ছিল

আমার বক্তব্য: আপনি যদি সাধারণ পরিস্থিতিতে ব্যতিক্রম ব্যবহার করেন তবে আপনি কীভাবে অস্বাভাবিক (যেমন ব্যতিক্রম আল) পরিস্থিতি সনাক্ত করবেন?

অবশ্যই, ব্যতিক্রমগুলি খুব বেশি ব্যবহার না করার জন্য আরও শক্তিশালী কারণ রয়েছে, বিশেষত কর্মক্ষমতা-ভিত্তিক


13
উদাহরণ: যখন আমি একটি নেট প্রোগ্রাম ডিবাগ করি তখন আমি ভিজ্যুয়াল স্টুডিও থেকে এটি চালু করি এবং আমি ভিএসকে সমস্ত ব্যতিক্রম ভেঙে যেতে বলি। যদি আপনি একটি প্রত্যাশিত আচরণ হিসাবে ব্যতিক্রমগুলির উপর নির্ভর করেন তবে আমি আর এটি করতে পারি না (যেহেতু এটি 5 টাইম / সেকেন্ড ভাঙবে), এবং কোডটির সমস্যাযুক্ত অংশটি সনাক্ত করা আরও জটিল।
ব্রান

15
দেখানোর জন্য +1 আপনি একটি ব্যতিক্রম খড় তৈরি করতে চান না যাতে কোনও আসল ব্যতিক্রমী সুইটি খুঁজে পেতে পারে।
অনুদান ওয়াগনার

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

11
@ পিটার: ব্যতিক্রমগুলি না ভেঙে ডিবাগিং করা কঠিন এবং সমস্ত ব্যতিক্রমগুলি ডিজাইন অনুসারে যদি তা পাওয়া যায় তবে তা ধরা বেদনাদায়ক। আমি মনে করি যে একটি ডিজাইন যা ডিবাগিংকে শক্ত করে তোলে প্রায় আংশিকভাবে ভেঙে যায় (অন্য কথায়, ডিজাইনটি ডিবাগিংয়ের সাথে কিছু করার জন্য রয়েছে, আইএমও)
ব্রান

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

157

ব্যতিক্রমগুলি মূলত gotoপরবর্তীকালের সমস্ত পরিণতি সহ অ-স্থানীয় বিবৃতি। প্রবাহ নিয়ন্ত্রণের জন্য ব্যতিক্রমগুলি ব্যবহার করা সর্বনিম্ন বিস্ময়ের নীতি লঙ্ঘন করে , প্রোগ্রামগুলি পড়া কঠিন করে তোলে (মনে রাখবেন প্রোগ্রামগুলি প্রোগ্রামারদের জন্য প্রথমে লেখা আছে)।

তদুপরি, এই সংকলক বিক্রেতারা প্রত্যাশা করে না। তারা আশা করে যে ব্যতিক্রমগুলি খুব কমই নিক্ষিপ্ত হবে এবং তারা সাধারণত throwকোডটি বেশ অযোগ্য করে দেয়। .NET- এ ব্যয় করা সবচেয়ে ব্যয়বহুল অপারেশন।

তবে কিছু ভাষা (উল্লেখযোগ্য পাইথন) ফ্লো-কন্ট্রোল কনস্ট্রাক্ট হিসাবে ব্যতিক্রম ব্যবহার করে। উদাহরণস্বরূপ, StopIterationআর কোনও আইটেম না থাকলে পুনরাবৃত্তি একটি ব্যতিক্রম উত্থাপন করে । এমনকি স্ট্যান্ডার্ড ল্যাংগুয়েজ কনস্ট্রাক্ট (যেমন for) এর উপর নির্ভর করে।


11
আরে, ব্যতিক্রম অবাক হয় না! যখন আপনি "এটি একটি খারাপ ধারণা" বলছেন এবং তারপরে আপনি নিজের সাথে বিরোধিতা করেন এবং তারপরে "তবে অজগরটিতে এটি একটি ভাল ধারণা"।
হাসেন

6
আমি এখনও মোটেও নিশ্চিত নই: 1) দক্ষতা এই প্রশ্নের পাশাপাশি ছিল, প্রচুর নন-বাচ প্রোগ্রাম কম যত্ন নিতে পারে না (উদাহরণস্বরূপ ইউজার ইন্টারফেস) 2) আশ্চর্যজনক: যেমন আমি বলেছিলাম যে এটি কেবল অবাক হওয়ার কারণ এটি ব্যবহার করা হয়নি, তবে প্রশ্নটি রয়ে গেছে: প্রথমে আইডি ব্যবহার করবেন না কেন? তবে, যেহেতু এটি উত্তর
পিটার

4
+1 আসলে আমি খুশি যে আপনি পাইথন এবং সি # এর মধ্যে পার্থক্য চিহ্নিত করেছেন। আমি মনে করি না এটি একটি বৈপরীত্য। পাইথন অনেক বেশি গতিশীল এবং এইভাবে ব্যতিক্রমগুলি ব্যবহার করার প্রত্যাশা ভাষাতে বেকড। এটি পাইথনের ইএএফপি সংস্কৃতিরও একটি অংশ। আমি জানি না কোন পদ্ধতির ধারণাটি বিশুদ্ধ বা আরও স্ব-সামঞ্জস্যপূর্ণ, তবে আমি কোড লেখার ধারণার মতই করি যা অন্যরা এটি করার প্রত্যাশা করে, যার অর্থ বিভিন্ন ভাষায় বিভিন্ন স্টাইল।
মার্ক ই। হাজেস

13
সঙ্গে ভিন্ন goto, অবশ্যই, ব্যতিক্রম সঠিকভাবে ইন্টারঅ্যাক্ট আপনার কল স্ট্যাক এবং আভিধানিক scoping সঙ্গে, এবং স্ট্যাকের ছেড়ে বা জগাখিচুড়ি সুযোগগুলি না।
লুকাস এদার

4
আসলে, বেশিরভাগ ভিএম বিক্রেতারা ব্যতিক্রমগুলি আশা করে এবং দক্ষতার সাথে তাদের পরিচালনা করে। যেহেতু @ লুকাসেদার নোটগুলি ব্যতিক্রমগুলি সম্পূর্ণ কাঠামোর মতো নয় যেগুলি কাঠামোগত।
মার্সিন

29

আমার থাম্বের নিয়মটি হ'ল:

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

ব্যতিক্রমগুলির সাথে আমি যে সমস্যাটি দেখছি তা নিখুঁত বাক্য বিন্যাসের দৃষ্টিভঙ্গির (আমি বেশ নিশ্চিত যে পারফোনেন্সের ওভারহেডটি ন্যূনতম) is আমি পুরো জায়গা জুড়ে চেষ্টা-ব্লক পছন্দ করি না।

এই উদাহরণটি ধরুন:

try
{
   DoSomeMethod();  //Can throw Exception1
   DoSomeOtherMethod();  //Can throw Exception1 and Exception2
}
catch(Exception1)
{
   //Okay something messed up, but is it SomeMethod or SomeOtherMethod?
}

.. আরেকটি উদাহরণ হতে পারে যখন আপনাকে কোনও কারখানা ব্যবহার করে কোনও হ্যান্ডেলটিতে কিছু বরাদ্দ করতে হবে এবং সেই কারখানাটি তার ব্যতিক্রম করতে পারে:

Class1 myInstance;
try
{
   myInstance = Class1Factory.Build();
}
catch(SomeException)
{
   // Couldn't instantiate class, do something else..
}
myInstance.BestMethodEver();   // Will throw a compile-time error, saying that myInstance is uninitalized, which it potentially is.. :(

হ্যাঁ, ব্যক্তিগতভাবে, আমি মনে করি আপনার বিরল ত্রুটি-শর্তগুলির জন্য ব্যতিক্রমগুলি রাখা উচিত (স্মৃতিশক্তি ইত্যাদির বাইরে) এবং পরিবর্তে আপনার ত্রুটি পরীক্ষা করার জন্য রিটার্নভ্যালুগুলি (ভ্যালুয়াল ক্লাস, স্ট্রাক্টস বা এনাম) ব্যবহার করা উচিত।

আশা করি আমি আপনার প্রশ্নটি সঠিক বুঝতে পেরেছি :)


4
পুনরায়: আপনার দ্বিতীয় উদাহরণ - কেন কেবল বিল্ডের পরে চেষ্টা ব্লকের ভিতরে বেস্টমেথডএভারকে কল দেওয়া হয়নি? যদি বিল্ড () একটি ব্যতিক্রম ছুঁড়ে, এটি কার্যকর করা হবে না এবং সংকলক খুশি।
ব্লারগবার্ড

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

আপনার ক্যাচ ব্লকে আপনার ব্যতিক্রম অনুবাদ করা উচিত (অ্যাবস্ট্রাকশন স্তরের উপযুক্ত কোনও ব্যতিক্রম টাইপের ক্ষেত্রে) catch এফওয়াইআই: "মাল্টি-ক্যাচ" জাভা
into-তে

এফওয়াইআই: সি ++ এ আপনি বিভিন্ন ব্যতিক্রম ধরার চেষ্টা করার পরে একাধিক ক্যাচ রাখতে পারেন।
রবিএইচ

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

25

প্রচুর উত্তরের প্রথম প্রতিক্রিয়া:

আপনি প্রোগ্রামারদের জন্য লিখেছেন এবং কমপক্ষে অবাক হওয়ার নীতি

অবশ্যই! তবে একটি যদি সবসময় আরও পরিষ্কার হয় না।

এটি বিস্ময়কর হওয়া উচিত নয় যেমন: ডিভাইড (1 / x) ক্যাচ (ডিভিশনবাইজারো) আমার কাছে (কনরাড এবং অন্যদের কাছে) এর চেয়ে বেশি স্পষ্ট। এই ধরণের প্রোগ্রামিংয়ের প্রত্যাশিত বাস্তবতা নিখুঁতভাবে প্রচলিত এবং সত্যই এখনও প্রাসঙ্গিক। সম্ভবত আমার উদাহরণে যদি একটি পরিষ্কার হয়।

তবে ডিভিশনবাইজারো এবং ফাইলনোটফাউন্ড সেই বিষয়ে আইএফএসের চেয়ে পরিষ্কার।

অবশ্যই এটি যদি কম পারফরম্যান্ট হয় এবং প্রতি সেকেন্ডে এক মিলিয়ন সময় প্রয়োজন হয় তবে আপনার অবশ্যই এটি এড়ানো উচিত, তবে তবুও আমি ওভারাল ডিজাইন এড়াতে কোনও ভাল কারণ পড়ি নি।

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

সাধারণ পরিস্থিতিতে ব্যতিক্রম, আপনি কীভাবে অস্বাভাবিক (যেমন ব্যতিক্রমী) পরিস্থিতি সনাক্ত করবেন?

অনেক প্রতিক্রিয়া sth। এই যেমন খাঁজ জ্বলে শুধু তাদের ধর, না? আপনার পদ্ধতিটি পরিষ্কার, ভাল ডকুমেন্টেড এবং এটির চুক্তিটি হানউনারিং হওয়া উচিত। আমি অবশ্যই এই প্রশ্নটি গ্রহণ করব না ad

সমস্ত ব্যতিক্রম নিয়ে ডিবাগ করা: একই, এটি কেবল কখনও কখনও করা হয় কারণ ব্যতিক্রমগুলি ব্যবহার না করার নকশাটি সাধারণ। আমার প্রশ্ন ছিল: প্রথম স্থানে কেন এটি সাধারণ?


1
1) আপনি সবসময় xকল করার আগে চেক করেন 1/x? 2) ধরার জন্য আপনি কি প্রতিটি বিভাগের অপারেশনকে ট্রাই-ক্যাচ ব্লকে আবদ্ধ করেন DivideByZeroException? 3) আপনি পুনরুদ্ধার করতে ক্যাচ ব্লকে কোন যুক্তি রাখেন DivideByZeroException?
লাইটম্যান 11

1
ডিভিশনবাইজারো এবং ফাইলনোটফাউন্ড ব্যতীত খারাপ উদাহরণ কারণ সেগুলি ব্যতিক্রমী কেস হিসাবে ব্যতিক্রম হিসাবে গণ্য করা উচিত।
0x6C38

এখানকার "অ্যান্টি-ব্যতিক্রম" লোকেরা টাউটিংয়ের চেয়ে ফাইলে পাওয়া যায় না এমন পদ্ধতিতে "অতিরিক্ত ব্যতিক্রমী" কিছুই নেই। ক্রেস্টলি হ্যান্ডেল করা ফাইলনটফাউন্ড ব্যতিক্রমের openConfigFile();সাথে ক্যাচ করা ফাইলনটফাউন্ড অনুসরণ করা যেতে পারে { createDefaultConfigFile(); setFirstAppRun(); }; কোনও ক্র্যাশ নেই, আসুন শেষ ব্যবহারকারীটির অভিজ্ঞতা আরও ভাল করা উচিত, আরও খারাপ নয়। আপনি বলতে পারেন "তবে কী যদি এটি সত্যই প্রথম রান না হয় এবং তারা প্রতিবারই তা পায়?" কমপক্ষে অ্যাপ্লিকেশনটি প্রতিবার চালিত হয় এবং প্রতিটি স্টার্টআপে ক্র্যাশ হয় না! 1-থেকে-10 "এ ভয়ঙ্কর": প্রতিটি সূচনা = 3 বা 4 "প্রথম রান", প্রতিটি সূচনা = 10 কে ক্র্যাশ করুন
লুডুভিজক

আপনার উদাহরণগুলি ব্যতিক্রম। না, আপনি সবসময় xকল করার আগে চেক করেন না 1/x, কারণ এটি সাধারণত ভাল। ব্যতিক্রমী কেসটি এমন ক্ষেত্রে যেখানে এটি ঠিক নেই। আমরা এখানে পৃথিবী-নাড়াচাড়া করার কথা বলছি না, তবে উদাহরণস্বরূপ একটি মৌলিক পূর্ণসংখ্যা যেমন একটি এলোমেলোভাবে দেওয়া xহয়েছে, 4294967296 এর মধ্যে কেবল 1 বিভাজন করতে ব্যর্থ হবে। এটি ব্যতিক্রমী এবং ব্যতিক্রমগুলি এটির সাথে মোকাবিলা করার একটি ভাল উপায়। তবে, আপনি কোনও switchবিবৃতিটির সমতুল্য প্রয়োগ করতে ব্যতিক্রমগুলি ব্যবহার করতে পারেন , তবে এটি বেশ নির্বোধ হবে।
Thor84no

16

ব্যতিক্রম আগে, সি, সেখানে ছিল setjmpএবং longjmpযে স্ট্যাকের ফ্রেম একটি অনুরূপ unrolling সম্পন্ন করার জন্য ব্যবহার করা যেতে পারে।

তারপরে একই কনস্ট্রাক্টটির একটি নাম দেওয়া হয়েছিল: "ব্যতিক্রম"। এবং বেশিরভাগ উত্তর তার ব্যবহার সম্পর্কে তর্ক করার জন্য এই নামের অর্থের উপর নির্ভর করে, দাবি করে যে ব্যতিক্রমগুলি ব্যতিক্রমী পরিস্থিতিতে ব্যবহার করার উদ্দেশ্যে to এটি আসল উদ্দেশ্য ছিল না longjmp। বেশ কয়েকটি পরিস্থিতি ছিল যেখানে আপনাকে অনেকগুলি স্ট্যাক ফ্রেম জুড়ে নিয়ন্ত্রণ প্রবাহ ভঙ্গ করতে হবে।

ব্যতিক্রমগুলি আরও সাধারণ যে আপনি এটি একই স্ট্যাক ফ্রেমের মধ্যেও ব্যবহার করতে পারেন। এটি gotoআমার সাথে ভুল বলে মনে করে এর সাথে উপমা দেয় believe গোটোস একটি দৃly়ভাবে জোড়াযুক্ত জুড়ি (এবং তেমন হয় setjmpএবং longjmp)। ব্যতিক্রমগুলি একটি স্বচ্ছভাবে মিলিত প্রকাশ / সাবস্ক্রাইব অনুসরণ করে যা অনেক ক্লিনার! সুতরাং একই স্ট্যাক ফ্রেমের মধ্যে এগুলি ব্যবহার করা gotos এর ব্যবহারের মতোই একই জিনিস ।

বিভ্রান্তির তৃতীয় উত্স সেগুলি সম্পর্কিত কিনা তা চেক বা চেক না করা সম্পর্কিত। অবশ্যই, চেক করা ব্যতিক্রমগুলি নিয়ন্ত্রণ প্রবাহ এবং সম্ভবত প্রচুর পরিমাণে ব্যবহার করার জন্য বিশেষত ভয়ঙ্কর বলে মনে হচ্ছে।

চেক করা ব্যতিক্রমগুলি কন্ট্রোল প্রবাহের জন্য দুর্দান্ত তবে একবার আপনি সমস্ত ভিক্টোরিয়ান হ্যাঙ্গআপগুলিতে এসে কিছুটা বাঁচেন।

আমার প্রিয় ব্যবহার হ'ল throw new Success()কোডের দীর্ঘ অংশের একটি ক্রম যা একের পর এক জিনিস চেষ্টা করে যতক্ষণ না এটি এটি সন্ধান করছে। প্রতিটি জিনিস - প্রতিটি যুক্তিযুক্ত অংশে - অভ্যাসগতভাবে বাসা বাঁধতে পারে তাই breakএটি কোনও ধরণের শর্ত পরীক্ষার বাইরেও রয়েছে। if-elseপ্যাটার্ন ভঙ্গুর হয়। যদি আমি একটি সম্পাদনা করি elseবা সিনট্যাক্সটিকে অন্য কোনও উপায়ে বিশৃঙ্খলা করি, তবে একটি লোমযুক্ত বাগ রয়েছে।

কোড প্রবাহকে throw new Success() রৈখিক করে তোলে । আমি স্থানীয়ভাবে সংজ্ঞায়িত Successক্লাস ব্যবহার করি - অবশ্যই পরীক্ষিত - যাতে আমি এটি ধরতে ভুলে গেলে কোডটি সংকলন করবে না। এবং আমি অন্য পদ্ধতির Successএসকে ধরছি না।

কখনও কখনও আমার কোড একের পর এক জিনিস পরীক্ষা করে এবং সমস্ত কিছু ঠিকঠাক থাকলে সফল হয়। এক্ষেত্রে আমার একই রকম লিনিয়ারাইজেশন রয়েছে throw new Failure()

পৃথক ফাংশন ব্যবহার করে প্রাকৃতিক স্তরের বগিটি হয়। সুতরাং returnসমাধানটি অনুকূল নয়। আমি জ্ঞানীয় কারণে এক জায়গায় একটি পৃষ্ঠা বা দুটি কোড রাখতে পছন্দ করি। আমি অতি-সূক্ষ্মভাবে বিভক্ত কোডে বিশ্বাস করি না।

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

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

আমি ব্যক্তিগতভাবে স্ট্যাক ফ্রেমগুলি জুড়ে প্যাটার্নটি ব্যবহার করি না এবং আমি দেখতে পাচ্ছি যে কীভাবে এটি মার্জিতভাবে ডিজাইনের পরিশীলনের প্রয়োজন হবে। তবে অল্প পরিমাণে ব্যবহার করা ঠিক আছে।

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


3
এই নিদর্শনটি ব্যবহার করে, আমার বেশিরভাগ মোটা ফাংশনটির শেষে দুটি ছোট ক্যাচ রয়েছে - একটি সাফল্যের জন্য এবং একটি ব্যর্থতার জন্য এবং সেখানেই ফাংশনটি সঠিকভাবে সরল প্রতিক্রিয়া প্রস্তুত করতে বা রিটার্ন মান প্রস্তুত করার মতো জিনিসগুলিকে গুটিয়ে রাখে। মোড়ক আপ করার জন্য একক জায়গা থাকা ভাল। return-Pattern বিকল্প এমন প্রত্যেকটি ফাংশন জন্য দুটি ফাংশন প্রয়োজন হবে। সার্লেলেট প্রতিক্রিয়া বা এই জাতীয় অন্যান্য ক্রিয়াকলাপ প্রস্তুত করার জন্য একটি বাহ্যিক এবং গণনা করার জন্য একটি অভ্যন্তর one পিএস: একজন ইংরেজ প্রফেসর সম্ভবত পরামর্শ দিয়েছিলেন যে আমি শেষ প্যারা: ") "" অবাক করা "না হয়ে" বিস্ময়কর "ব্যবহার করব
নেক্রোমেন্সার

11

স্ট্যান্ডার্ড অ্যাঞ্জারটি হ'ল ব্যতিক্রমগুলি নিয়মিত নয় এবং ব্যতিক্রমী ক্ষেত্রে ব্যবহার করা উচিত।

একটি কারণ, যা আমার কাছে গুরুত্বপূর্ণ তা হ'ল আমি যখন কোনও try-catchরক্ষণাবেক্ষণ বা ডিবাগ করা সফ্টওয়্যারটিতে যখন একটি নিয়ন্ত্রণ কাঠামো পড়ি তখন মূল কোডার কেন if-elseকাঠামোর পরিবর্তে ব্যতিক্রম হ্যান্ডলিং ব্যবহার করে তা জানার চেষ্টা করি । এবং আমি একটি ভাল উত্তর আশা করি।

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


আমি মনে করি একটি অপরিবর্তিত উত্তর। কম্পিউটার যখন খুব বেশি ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরেীরে होटलিনিনমেমেমেয়মেয়ਨਨ The computer computer) জানি না, বা যদি এই অ্যান্টি-প্যাটার্নটি ব্যবহারের পক্ষে কোন যৌক্তিকতা নেই।
টিম আবেল

9

পারফরম্যান্স সম্পর্কে কীভাবে? .NET ওয়েব অ্যাপ্লিকেশন লোড পরীক্ষার সময় আমরা একটি সাধারণভাবে ঘটে যাওয়া ব্যতিক্রমটি স্থির না করা পর্যন্ত আমাদের ওয়েব সার্ভারে 100 জন সিমুলেটেড ব্যবহারকারীকে শীর্ষে রেখেছি এবং সেই সংখ্যা 500 ব্যবহারকারী হিসাবে বেড়েছে।


8

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

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

উদাহরণস্বরূপ, প্রথম পদ্ধতির চেয়ে দ্বিতীয় পদ্ধতিটি ব্যবহার করা সহজ:

/**
 * Adds two positive numbers.
 *
 * @param addend1 greater than zero
 * @param addend2 greater than zero
 * @throws AdditionException if addend1 or addend2 is less than or equal to zero
 */
int addPositiveNumbers(int addend1, int addend2) throws AdditionException{
  if( addend1 <= 0 ){
     throw new AdditionException("addend1 is <= 0");
  }
  else if( addend2 <= 0 ){
     throw new AdditionException("addend2 is <= 0");
  }
  return addend1 + addend2;
}

/**
 * Adds two positive numbers.
 *
 * @param addend1 greater than zero
 * @param addend2 greater than zero
 */
public int addPositiveNumbers(int addend1, int addend2) {
  if( addend1 <= 0 ){
     throw new IllegalArgumentException("addend1 is <= 0");
  }
  else if( addend2 <= 0 ){
     throw new IllegalArgumentException("addend2 is <= 0");
  }
  return addend1 + addend2;
}

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

  1. আপনার এটি নথিভুক্ত করার দরকার নেই।
  2. এটির জন্য আপনাকে পরীক্ষা করার দরকার নেই (আপনার ইউনিট পরীক্ষার কৌশলটি কতটা আগ্রাসী upon
  3. তিনটি ব্যবহারের ক্ষেত্রে আপনার কলার প্রয়োজন হয় না।

মূল-স্তরের বিষয়টি হ'ল ব্যতিক্রমগুলি রিটার্ন কোড হিসাবে ব্যবহার করা উচিত নয় কারণ মূলত আপনি কেবল আপনার এপিআইই নয়, কলারের এপিআইও জটিল করেছেন।

সঠিক জিনিসটি করা অবশ্যই একটি ব্যয়েই আসে। ব্যয়টি হ'ল প্রত্যেকেরই বুঝতে হবে যে তাদের ডকুমেন্টেশনটি পড়তে এবং অনুসরণ করতে হবে। আশা করি যেভাবেই হোক।


7

আমি মনে করি আপনি প্রবাহ নিয়ন্ত্রণের জন্য ব্যতিক্রমগুলি ব্যবহার করতে পারেন। তবে এই কৌশলটির একটি ফ্লিপসাইড রয়েছে। ব্যতিক্রমগুলি তৈরি করা ব্যয়বহুল জিনিস, কারণ তাদের স্ট্যাক ট্রেস তৈরি করতে হবে। সুতরাং আপনি যদি ব্যতিক্রমী পরিস্থিতি কেবলমাত্র একটি ব্যতিক্রমী পরিস্থিতির ইঙ্গিত দেওয়ার চেয়ে বেশিবার ব্যবহার করতে চান তবে আপনাকে নিশ্চিত করতে হবে যে স্ট্যাকের চিহ্নগুলি তৈরি করা আপনার কার্যকারিতাটিকে নেতিবাচকভাবে প্রভাবিত করে না।

ব্যতিক্রমগুলি তৈরির ব্যয়টি হ্রাস করার সর্বোত্তম উপায় হ'ল এইভাবে ফিলিংইনস্ট্যাকট্রেস () পদ্ধতিটি ওভাররাইড করা:

public Throwable fillInStackTrace() { return this; }

এই জাতীয় ব্যতিক্রমের কোনও স্ট্যাকট্রেস পূরণ করা হবে না।


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

5

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

এছাড়াও আপনি ক্রিয়াকলাপের আরও ঘৃণ্যতা সম্পাদন করছেন না যেখানে আপনি প্রবাহ নিয়ন্ত্রণ সম্পাদনের জন্য অন্য কোথাও ধরা পড়ার জন্য খাঁটি ব্যতিক্রম ছুঁড়ে মারছেন। আপনি আসলে একটি ব্যতিক্রমী কেস পরিচালনা করছেন।


5

আমি আমার ব্লগ পোস্টে বর্ণিত সেরা অনুশীলনগুলি এখানে :

  • আপনার সফ্টওয়্যারটিতে অপ্রত্যাশিত পরিস্থিতি বর্ণনা করতে একটি ব্যতিক্রম ছুঁড়ে ফেলুন
  • ইনপুট বৈধতার জন্য রিটার্ন মানগুলি ব্যবহার করুন
  • আপনি যদি কোনও গ্রন্থাগার নিক্ষেপ করা ব্যতিক্রমগুলি কীভাবে মোকাবেলা করতে জানেন তবে তাদেরকে সর্বনিম্ন স্তরে ধরুন
  • আপনার যদি অপ্রত্যাশিত ব্যতিক্রম থাকে তবে বর্তমান অপারেশনটিকে পুরোপুরি বাতিল করুন। আপনি কীভাবে তাদের সাথে ডিল করতে হয় তা ভান করবেন না

4

কোডটি পড়া শক্ত কারণ, আপনার এটির ডিবাগ করতে সমস্যা হতে পারে, দীর্ঘ সময় পরে বাগগুলি ঠিক করার সময় আপনি নতুন বাগগুলি প্রবর্তন করবেন, এটি সংস্থান এবং সময়ের ক্ষেত্রে আরও ব্যয়বহুল এবং আপনি যদি আপনার কোডটি ডিবাগ করছেন এবং এটি আপনাকে বিরক্ত করে and ডিবাগার প্রতিটি ব্যতিক্রমের ঘটনাটি থামায়;)


4

বর্ণিত কারণগুলি ছাড়াও, প্রবাহ নিয়ন্ত্রণের ক্ষেত্রে ব্যতিক্রমগুলি না ব্যবহার করার একটি কারণ হ'ল এটি ডিবাগিং প্রক্রিয়াটিকে ব্যাপকভাবে জটিল করে তুলতে পারে।

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


1
আমি ইতিমধ্যে একটি হাইগারকে হ্যান্ডলড করেছি: সমস্ত ব্যাতিক্রমের উপর ডিবাগ করা: একই, ব্যতিক্রমগুলি ব্যবহার না করার নকশাটি সাধারণ কারণ এটি করা হয়েছে। আমার প্রশ্ন ছিল: প্রথম স্থানে কেন এটি সাধারণ?
পিটার

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

3

ধরে নিই আপনার কাছে এমন একটি পদ্ধতি রয়েছে যা কিছু গণনা করে। এখানে অনেকগুলি ইনপুট প্যারামিটার রয়েছে যাচাই করতে হবে, তারপরে 0 এর চেয়ে বড় সংখ্যার ফিরে আসতে।

বৈধতা ত্রুটি সিগন্যাল করতে রিটার্ন মানগুলি ব্যবহার করে, এটি সহজ: পদ্ধতিটি যদি 0 এর পরে কম নম্বর দেয় তবে একটি ত্রুটি ঘটে। তাহলে কীভাবে বলতে হবে কোন প্যারামিটারটি বৈধতা দেয় নি?

আমি মনে করি আমার সি দিন থেকে প্রচুর ফাংশন এ জাতীয় ত্রুটি কোডগুলি ফেরত দিয়েছে:

-1 - x lesser then MinX
-2 - x greater then MaxX
-3 - y lesser then MinY

প্রভৃতি

তাহলে কি আসলেই কম পাঠযোগ্য এবং ছড়িয়ে পড়া এবং ব্যতিক্রম ধরা পড়ে?


এ কারণেই তারা এনামগুলি আবিষ্কার করেছিল :) তবে যাদুকরী সংখ্যাগুলি সম্পূর্ণ আলাদা বিষয় .. en.wikedia.org/wiki/…
ইসাক সাভো

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

3

আপনি যেমন স্ক্রু ঘুরিয়ে দেওয়ার জন্য হাতুজের নখর ব্যবহার করতে পারেন ঠিক তেমনই আপনি নিয়ন্ত্রণ প্রবাহের ক্ষেত্রে ব্যতিক্রমও ব্যবহার করতে পারেন। এর অর্থ এই নয় যে এটি বৈশিষ্ট্যের উদ্দেশ্যপ্রাপ্ত ব্যবহারifবিবৃতি প্রকাশ শর্ত, যার উদ্দেশ্যে ব্যবহার করা হয় প্রবাহ নিয়ন্ত্রণ।

সেই উদ্দেশ্যে ডিজাইন করা বৈশিষ্ট্যটি ব্যবহার না করার জন্য আপনি যদি অযৌক্তিক উপায়ে কোনও বৈশিষ্ট্য ব্যবহার করছেন, তবে এতে একটি যুক্ত ব্যয় হবে। এই ক্ষেত্রে, স্পষ্টতা এবং পারফরম্যান্সের কোনও আসল যোগ করা মূল্য নেই। ব্যতিক্রমগুলি কীভাবে আপনাকে বহুল-স্বীকৃত ifবিবৃতিটির চেয়ে বেশি কিনে ?

অন্য উপায় বলল, ঠিক কারণ আপনার পারেন মানে এই নয় আপনি উচিত


1
আপনি কি বলছেন যে ব্যতিক্রম হওয়ার দরকার নেই, ifসাধারণ ব্যবহারের পরে বা মৃত্যুদণ্ড কার্যকর করার উদ্দেশ্যে এটি উদ্দেশ্যযুক্ত নয় (বৃত্তাকার যুক্তি) নয়?
Val,

1
@Val: ব্যতিক্রমসমূহ ব্যতিক্রমী পরিস্থিতিতে জন্য - যদি আমরা একটি ব্যতিক্রম নিক্ষেপ করা এবং এটি পরিচালনা করতে যথেষ্ট সনাক্ত, আমরা আমাদের কাছে পর্যাপ্ত তথ্য না এটা নিক্ষেপ এবং এখনও এটি পরিচালনা। আমরা সরাসরি পরিচালনা করার যুক্তিতে যেতে পারি এবং ব্যয়বহুল, অতিমাত্রায় চেষ্টা / ধরতে পারি।
ব্রায়ান ওয়াটস

এই যুক্তি অনুসারে, আপনার পাশাপাশি ব্যতিক্রম নাও থাকতে পারে এবং একটি ব্যতিক্রম ছোঁড়ার পরিবর্তে সর্বদা একটি সিস্টেমের প্রস্থান করুন। যদি আপনি প্রস্থান করার আগে কিছু করতে চান তবে একটি মোড়ক তৈরি করে কল করুন। জাভা উদাহরণ: public class ExitHelper{ public static void cleanExit() { cleanup(); System.exit(1); } }তারপরে নিক্ষেপের পরিবর্তে কেবল এটি কল করুন: ExitHelper.cleanExit();যদি আপনার যুক্তিটি যথাযথ হয় তবে এটিই পছন্দসই পদ্ধতি এবং কোনও ব্যতিক্রম হবে না। আপনি মূলত বলছেন "ব্যতিক্রম হওয়ার একমাত্র কারণ হ'ল ভিন্ন উপায়ে ক্রাশ" "
লুডুভিজক

@ অ্যারন: আমি যদি উভয়ই ব্যতিক্রম ছুঁড়ে ফেলি এবং ধরতে পারি তবে তা এড়াতে আমার কাছে পর্যাপ্ত তথ্য রয়েছে। এর অর্থ এই নয় যে সমস্ত ব্যতিক্রম হঠাৎ মারাত্মক। অন্যান্য কোডগুলি আমি নিয়ন্ত্রণ করি না এটি এটি ধরতে পারে এবং এটি ঠিক আছে। আমার যুক্তি, যা সুস্পষ্ট রইল, তা হ'ল একই প্রসঙ্গে ব্যতিক্রম ছুঁড়ে ফেলা এবং ধরা ধরা অতিরিক্ত is আমি করিনি, বা করব না, সমস্ত ব্যতিক্রম প্রক্রিয়া থেকে বেরিয়ে আসা উচিত।
ব্রায়ান ওয়াটস

@ ব্রায়ান ওয়াটস স্বীকৃত। অনেকে আছে বলেন আপনি শুধুমাত্র কিছু আপনার কাছ থেকে পুনরুদ্ধার করতে পারবেন না ব্যতিক্রম ব্যবহার করা উচিত, এবং এক্সটেনশান দ্বারা সবসময় ব্যতিক্রম এ ক্র্যাশিং হওয়া উচিত। এ কারণেই এই বিষয়গুলি নিয়ে আলোচনা করা কঠিন; এখানে কেবল ২ টি মতামতই নয়, অনেকগুলি রয়েছে। আমি এখনও আপনার সাথে একমত নই, তবে দৃ .়তার সাথে নয়। এমন সময়গুলি যখন একসাথে নিক্ষেপ / ক্যাচ হয় সর্বাধিক পঠনযোগ্য, রক্ষণাবেক্ষণযোগ্য, সুন্দর দেখতে কোড; সাধারণত যদি আপনি ইতিমধ্যে অন্য ব্যতিক্রমগুলি ধরেন তবে এটি ঘটে তাই আপনার ইতিমধ্যে চেষ্টা / ধরা আছে এবং পৃথক ত্রুটি পরীক্ষার চেয়ে আরও 1 বা 2 টি আরও ক্যাচ যুক্ত করা আরও পরিষ্কার if
লুডুভিজক

3

অন্যরা যেমন উল্লেখ করেছেন, কমপক্ষে অবাক করে দেওয়ার নীতিটি কেবলমাত্র প্রবাহ নিয়ন্ত্রণের উদ্দেশ্যে ব্যতিক্রমকে অতিরিক্তভাবে ব্যবহার করতে নিষেধ করবে। অন্যদিকে, কোনও নিয়ম 100% সঠিক নয়, এবং সবসময় এমন ক্ষেত্রে দেখা যায় যে ব্যতিক্রমগুলি "ঠিক সঠিক সরঞ্জাম" - অনেকটা gotoনিজের মতো , উপায় অনুসারে, যা জাভা-র মতো ভাষাতে breakএবং জাহাজগুলিতে জাহাজে আসে continueভারী নেস্টেড লুপগুলি থেকে ঝাঁপ দেওয়ার প্রায়শই সঠিক উপায়, যা সর্বদা এড়ানো যায় না।

নিম্নলিখিত ব্লগ পোস্টটি অ-স্থানীয়দের জন্য একটি জটিল বরং বরং আকর্ষণীয় ব্যবহারের ক্ষেত্রে ব্যাখ্যা করেছে ControlFlowException:

এটি ব্যাখ্যা করে যে কীভাবে JOOQ এর ভিতরে (জাভার জন্য একটি এসকিউএল অ্যাবস্ট্রাকশন লাইব্রেরি) , কিছু "বিরল" শর্ত পূরণ হওয়ার সাথে সাথে এই জাতীয় ব্যতিক্রমগুলি মাঝে মাঝে এসকিউএল রেন্ডারিং প্রক্রিয়াটি বাতিল করতে ব্যবহৃত হয়।

এই ধরনের শর্তগুলির উদাহরণগুলি:

  • অনেকগুলি বাঁধাইয়ের মানগুলির মুখোমুখি। কিছু ডাটাবেসগুলি তাদের এসকিউএল স্টেটমেন্টগুলিতে বিন্যাসের মানগুলিকে নির্বিচারে সমর্থন করে না (এসকিউএলাইট: 999, ইনগ্রেস 10.1.0: 1024, সিব্যাস এএসই 15.5: 2000, এসকিউএল সার্ভার ২০০: 2100)। এই ক্ষেত্রে, JOOQ এসকিউএল রেন্ডারিং পর্বটি বাতিল করে এবং ইনক্লাইড বাইন্ড মান সহ এসকিউএল বিবৃতিটিকে পুনরায় রেন্ডার করে। উদাহরণ:

    // Pseudo-code attaching a "handler" that will
    // abort query rendering once the maximum number
    // of bind values was exceeded:
    context.attachBindValueCounter();
    String sql;
    try {
    
      // In most cases, this will succeed:
      sql = query.render();
    }
    catch (ReRenderWithInlinedVariables e) {
      sql = query.renderWithInlinedBindValues();
    }

    যদি আমরা স্পষ্টরূপে এএসটি ক্যোয়ারী থেকে প্রতিবারের জন্য গণনা মানগুলি স্পষ্টরূপে বের করেছি, আমরা এই 999% প্রশ্নের জন্য এই সমস্যাটি ভুগছি না এমন মূল্যবান সিপিইউ চক্রগুলি নষ্ট করব।

  • কিছু যুক্তি কেবল অপ্রত্যক্ষভাবে একটি API এর মাধ্যমে উপলভ্য যা আমরা কেবল "আংশিকভাবে" চালাতে চাই। UpdatableRecord.store()পদ্ধতি একটি উত্পন্ন INSERTবা UPDATEবিবৃতি উপর নির্ভর করে Recordএর অভ্যন্তরীণ পতাকা। "বাইরের" থেকে, আমরা জানি না কী ধরণের যুক্তি রয়েছে store()(যেমন আশাবাদী লকিং, ইভেন্ট শ্রোতাদের পরিচালনা ইত্যাদি) তাই আমরা যখন ব্যাচের স্টেটমেন্টে বেশ কয়েকটি রেকর্ড সংরক্ষণ করি তখন আমরা সেই যুক্তিটি পুনরাবৃত্তি করতে চাই না, যেখানে আমরা store()কেবলমাত্র এসকিউএল বিবৃতি তৈরি করতে চাই , বাস্তবে এটি কার্যকর করা হয় না। উদাহরণ:

    // Pseudo-code attaching a "handler" that will
    // prevent query execution and throw exceptions
    // instead:
    context.attachQueryCollector();
    
    // Collect the SQL for every store operation
    for (int i = 0; i < records.length; i++) {
      try {
        records[i].store();
      }
    
      // The attached handler will result in this
      // exception being thrown rather than actually
      // storing records to the database
      catch (QueryCollectorException e) {
    
        // The exception is thrown after the rendered
        // SQL statement is available
        queries.add(e.query());                
      }
    }

    যদি আমরা store()যুক্তিটিকে "পুনরায় ব্যবহারযোগ্য" এপিআই-তে পরিণত করে থাকি যা এসকিউএলটি কার্যকরভাবে প্রয়োগ না করার জন্য কাস্টমাইজ করা যেতে পারে তবে আমরা এটিকে পুনরায় ব্যবহারের যোগ্য এপিআই বজায় রাখার পরিবর্তে আরও শক্তিশালী করে তুলতে চাই।

উপসংহার

সংক্ষেপে, আমাদের এই অ-স্থানীয় ব্যবহারগুলি goto[ম্যাসন হুইলারের] [৫] তার উত্তরে যা বলেছিল তার ঠিক ঠিক একই সাথে রয়েছে:

"আমি কেবলমাত্র এমন পরিস্থিতির মুখোমুখি হয়েছি যে আমি এই মুহুর্তে সঠিকভাবে মোকাবেলা করতে পারি না, কারণ এটি পরিচালনা করার মতো আমার কাছে যথেষ্ট প্রসঙ্গ নেই, তবে যে রুটিন আমাকে ডেকেছিল (বা কল স্ট্যাককে আরও কিছু বলা হয়েছে) এটি কীভাবে পরিচালনা করতে হবে তা জানতে হবে । "

এর উভয় ব্যবহারই ControlFlowExceptionsতাদের বিকল্পগুলির তুলনায় কার্যকর করা সহজ ছিল, যা প্রাসঙ্গিক ইন্টার্নালগুলির বাইরে রিফ্যাক্টর না করেই আমাদের অনেকগুলি যুক্তি পুনরায় ব্যবহার করতে দেয়।

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


2

সাধারণত নিম্ন স্তরে ব্যতিক্রম হ্যান্ডেল করার সাথে সাথে কোনও ভুল নেই wrong একটি ব্যতিক্রম একটি বৈধ বার্তা যা অপারেশন কেন সম্পাদন করা যায় না তার জন্য অনেক বিশদ সরবরাহ করে। এবং যদি আপনি এটি পরিচালনা করতে পারেন, আপনার উচিত।

সাধারণভাবে যদি আপনি জানেন যে ব্যর্থতার উচ্চ সম্ভাবনা রয়েছে যা আপনি যাচাই করতে পারেন ... আপনার চেকটি করা উচিত ... যেমন যদি (আপত্তি! = নাল) আপত্তি.মোহক ()

আপনার ক্ষেত্রে, আমি টাইমস্ট্যাম্পের সীমা ছাড়িয়েছে কিনা তা যাচাই করার জন্য তারিখের একটি সহজ উপায় আছে কিনা তা জানতে আমি সি # লাইব্রেরির সাথে যথেষ্ট পরিচিত নই। যদি এটি হয় তবে কেবল (.isuthor (ts)) কল করুন অন্যথায় আপনার কোডটি মূলত ঠিক আছে।

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


অ্যাডল পয়েন্ট: যদি আপনার ব্যতিক্রম ব্যর্থতা ক্যাপচারের তথ্য সরবরাহ করে ("পরম getWhatParamMessedMeUp ()" এর মত একজন জেনার), এটি আপনার API এর ব্যবহারকারীকে পরবর্তী কী করা উচিত সে সম্পর্কে একটি ভাল সিদ্ধান্ত নিতে সহায়তা করতে পারে। অন্যথায়, আপনি কেবল একটি ত্রুটি অবস্থায় একটি নাম দিচ্ছেন।
জেসনারোথিন

2

আপনি যদি নিয়ন্ত্রণ প্রবাহের জন্য ব্যতিক্রম হ্যান্ডলারগুলি ব্যবহার করেন তবে আপনি খুব সাধারণ এবং অলস হয়ে যাচ্ছেন। অন্য কেউ যেমন উল্লেখ করেছেন, আপনি হ্যান্ডলারটিতে প্রসেসিং পরিচালনা করছেন এমন কিছু ঘটেছিল জানেন তবে ঠিক কী? মূলত আপনি অন্য কোনও বিবৃতিটির জন্য ব্যতিক্রমটি ব্যবহার করছেন, যদি আপনি এটি নিয়ন্ত্রণ প্রবাহের জন্য ব্যবহার করে থাকেন।

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

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

আপনি যদি ঠিক কী ঘটেছিল তা নির্ধারণ করতে আপনার ব্যতিক্রম হ্যান্ডলারটিতে যুক্তি রাখেন, তবে সেই যুক্তিটি চেষ্টা ব্লকের ভিতরে না রাখার জন্য আপনি যথেষ্ট বোকা হয়ে যাবেন।

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

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


1
মোটেও সত্য নয়: "মূলত আপনি অন্য কোনও বক্তব্যের ব্যতিক্রমটি ব্যবহার করছেন, যদি আপনি এটি নিয়ন্ত্রণ প্রবাহের জন্য ব্যবহার করেন" "আপনি যদি এটি নিয়ন্ত্রণ প্রবাহের জন্য ব্যবহার করেন তবে আপনি জানেন যে আপনি ঠিক কী ধরেন এবং কখনই সাধারণ ক্যাচ ব্যবহার করেন না, তবে একটি অবশ্যই একটি নির্দিষ্ট!
পিটার

2

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

অন্যান্য ভাষাগুলির সেরা অনুশীলনের সাথে এর তেমন কিছুই করার নেই, তবে এটি আপনাকে দেখায় যে আপনি কিছু দিকনির্দেশনা (মোটামুটিভাবে) যে দিকে ভাবছেন সে বিষয়ে চিন্তাভাবনা করে কী করা যায়।

অবশ্যই আপনি এখনও জো-ইওয়ের মতো স্তুপটি উপরে উঠছেন এবং নিখুঁত হন তবে পারফরম্যান্স বিবেচনা রয়েছে তবে এটি "ওহ ক্রেপ, জামিনে দেয়" এর চেয়ে অনেক বেশি সাধারণ ধারণা যা বেশিরভাগ ক্যাচ / নিক্ষেপ ব্যতিক্রম সিস্টেমকে মূর্ত করে।


2

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

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

একটি উদাহরণ: মাইক্রোসফ্ট ভোল্টা একটি প্রকল্প যা সরাসরি অ্যাপ্লিকেশন .NET এ ওয়েব অ্যাপ্লিকেশন লেখার অনুমতি দেয় এবং ফ্রেমওয়ার্কটি কোন বিটগুলি কোথায় চালানো উচিত তা নির্ধারণের যত্ন নিতে দেয়। এর একটি পরিণতি হ'ল ভোল্টা জাভাস্ক্রিপ্টে সিআইএল সংকলন করতে সক্ষম হওয়া দরকার, যাতে আপনি ক্লায়েন্টের কোড চালাতে পারেন। তবে, একটি সমস্যা আছে: .NET এর মাল্টিথ্রেডিং রয়েছে, জাভাস্ক্রিপ্ট নেই। সুতরাং, ভোল্টা জাভাস্ক্রিপ্টের ব্যতিক্রমগুলি ব্যবহার করে জাভাস্ক্রিপ্টে ধারাবাহিকতা প্রয়োগ করে, তারপর সেই ধারাবাহিকতাগুলি ব্যবহার করে .NET থ্রেড প্রয়োগ করে। এইভাবে, ভোল্টা অ্যাপ্লিকেশনগুলি যে থ্রেডগুলি ব্যবহার করে একটি আনমোডাইফাইড ব্রাউজারে চালনার জন্য সংকলন করা যেতে পারে - সিলভারলাইটের প্রয়োজন নেই।


2

একটি নান্দনিক কারণ:

একটি চেষ্টা সবসময় ধরা পড়ার সাথে আসে, অন্যদিকে যদি অন্যটির সাথে আসতে হয় না।

if (PerformCheckSucceeded())
   DoSomething();

চেষ্টা / ধরার সাথে সাথে এটি অনেক বেশি ভার্বোস হয়ে যায়।

try
{
   PerformCheckSucceeded();
   DoSomething();
}
catch
{
}

এটি কোডের 6 টি লাইন।


1

তবে আপনি যে পদ্ধতিটি কল করেন তাতে কী হয় তা আপনি সর্বদা জানতে পারবেন না। ব্যতিক্রমটি কোথায় ছুঁড়েছে তা আপনি ঠিক জানবেন না। বৃহত্তর বিশদে ব্যতিক্রম বিষয় পরীক্ষা না করে ....


1

আমি অনুভব করি যে আপনার উদাহরণে কোনও ভুল নেই। বিপরীতে, ডাকা ফাংশনটি ফেলে দেওয়া ব্যতিক্রম উপেক্ষা করা একটি পাপ হবে।

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


দুঃখিত, এটি স্পষ্টত ভুল, ব্র্যান। এটি অবস্থার উপর নির্ভর করে। অবস্থা সর্বদা ক্ষুদ্র হয় না এমনটি হয় না। সুতরাং, যদি একটি বিবৃতি ঘন্টা, বা কয়েক দিন বা আরও বেশি সময় নিতে পারে।
এঙ্গো

জেভিএম-এ, তা। রিটার্নের চেয়ে বেশি ব্যয়বহুল নয়। চিত্রে যান. তবে প্রশ্নটি হল, আপনি যদি বিবৃতিতে কী লিখবেন, যদি একটি সাধারণ থেকে ব্যতিক্রমী কেস বলার জন্য কল কোডটি ইতিমধ্যে উপস্থিত ফাংশনে উপস্থিত না থাকে --- এইভাবে কোড নকল করুন।
এঙ্গো

1
ইনগো: একটি ব্যতিক্রমী পরিস্থিতি এমনটি যা আপনি আশা করেন না। যেমন আপনি প্রোগ্রামার হিসাবে ভাবেন নি। সুতরাং আমার নিয়মটি হল "লিখন কোড যা ব্যতিক্রম ছুঁড়ে না" :)
ব্রান

1
আমি কখনই ব্যতিক্রম হ্যান্ডলারগুলি লিখি না, আমি সবসময় সমস্যার সমাধান করি (যখন আমি এটি করতে পারি না তখন বাদে যখন আমি ফল্টিং কোডের উপর নিয়ন্ত্রণ রাখি না)। এবং আমি কখনই ব্যতিক্রম ছুঁড়ে না ফেলে ব্যতীত, যখন আমি লিখেছি কোডটি অন্য কারও (যেমন একটি লাইব্রেরি) ব্যবহারের উদ্দেশ্যে করা হয় except না আমাকে দ্বন্দ্ব দেখায়?
ব্রান

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

1

কয়েকটি সাধারণ প্রক্রিয়া রয়েছে যার মাধ্যমে কোনও ভাষা কোনও মান না দিয়েই কোনও পদ্ধতিতে প্রস্থান করার অনুমতি দিতে পারে এবং পরবর্তী "ক্যাচ" ব্লকটি অন্বেষণ করে:

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

  • পদ্ধতিটিতে এমন কোনও "লুকানো" পতাকাটি ফেরত দিন যা কোনও ব্যতিক্রম থেকে সাধারণ প্রত্যাবর্তনকে পৃথক করে এবং কলারটিকে পতাকাটি সেট করে যদি এটি সেট করা থাকে তবে একটি "ব্যতিক্রম" রুটিনে শাখাটি পরীক্ষা করে দেখুন। এই রুটিনটি ব্যতিক্রমী ক্ষেত্রে 1-2 নির্দেশাবলী যুক্ত করে, তবে কোনও ব্যতিক্রম ঘটলে তুলনামূলকভাবে সামান্য ওভারহেড।

  • কলারকে স্ট্যাকড রিটার্ন ঠিকানার সাথে সম্পর্কিত স্থির ঠিকানায় ব্যতিক্রম-হ্যান্ডলিং সম্পর্কিত তথ্য বা কোড রাখুন। উদাহরণস্বরূপ, এআরএম দিয়ে, "বিএল সাবরুটাইন" নির্দেশিকা ব্যবহারের পরিবর্তে, কেউ এই অনুক্রমটি ব্যবহার করতে পারে:

        adr lr,next_instr
        b subroutine
        b handle_exception
    next_instr:
    

সাধারণত প্রস্থান করার জন্য, সাবরুটাইন কেবলমাত্র করতে পারে bx lrবা pop {pc}; অস্বাভাবিক প্রস্থানের ক্ষেত্রে, সাব্রোটিন হয় প্রত্যাবর্তন বা ব্যবহারের আগে এলআর থেকে 4 বিয়োগ করবেsub lr,#4,pc (এআরএম বৈচিত্র, এক্সিকিউশন মোড ইত্যাদির উপর নির্ভর করে) যদি কলার এটির জন্য নকশাকৃত না হয় তবে এই পদ্ধতির খুব খারাপভাবে ক্ষতি হবে।

একটি ভাষা বা কাঠামো যা পরীক্ষিত ব্যতিক্রমগুলি ব্যবহার করে তার উপরের # 2 বা # 3 এর মতো কোনও ব্যবস্থাপনার দ্বারা পরিচালিত হওয়াগুলি উপকৃত হতে পারে, যখন চেক করা ব্যতিক্রমগুলি # 1 ব্যবহার করে পরিচালনা করা হয়। যদিও জাভাতে চেক করা ব্যতিক্রমগুলি বাস্তবায়ন হ'ল সংকীর্ণ, তবে কোনও কল সাইট যদি এটির মাধ্যমে বলতে পারে যে কোনও উপায় ছিল তবে এটি একটি খারাপ ধারণা হবে না, "এই পদ্ধতিটি এক্সকে ছোঁড়া হিসাবে ঘোষণা করা হয়েছে, তবে আমি এটি আশা করি না সর্বদা এটি করা; যদি এটি হয় তবে "চেক না করা" ব্যতিক্রম হিসাবে পুনর্বিবেচনা করুন a এমন ফ্রেমওয়ার্কে যেখানে চেক ব্যতিক্রমগুলি যেমন ফ্যাশনে পরিচালিত হয়েছিল, তারা পার্সিং পদ্ধতির মতো জিনিসগুলির জন্য প্রবাহ নিয়ন্ত্রণের একটি কার্যকর উপায় হতে পারে যা কিছু প্রসঙ্গে থাকতে পারে ব্যর্থতার উচ্চ সম্ভাবনা, তবে যেখানে ব্যর্থতা সাফল্যের চেয়ে মৌলিকভাবে আলাদা তথ্য ফিরে আসে should যাইহোক, এই জাতীয় নিদর্শন ব্যবহার করে এমন কোনও ফ্রেমওয়ার্ক সম্পর্কে অজানা। পরিবর্তে, আরও সাধারণ প্যাটার্নটি হ'ল সমস্ত ব্যতিক্রমের জন্য উপরের প্রথম পদ্ধতির (কোনও ব্যতিক্রম ব্যতীত ন্যূনতম ব্যয়, তবে ব্যতিক্রম ছুঁড়ে দেওয়া হলে উচ্চ ব্যয়) ব্যবহার করা।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.