c# - কিভাবে ব্যতিক্রম হ্যান্ডলিং জন্য চেষ্টা ধরা ব্যবহার করে ভাল অনুশীলন




.net exception (10)

একজন সহকর্মী বিকাশকারী হিসাবে দাবি করা এমনকি যে কেউ থেকে আমার সহকর্মী এর কোড বজায় রাখা, আমি প্রায়ই নিম্নলিখিত কোড দেখতে:

try
{
  //do something
}
catch
{
  //Do nothing
}

অথবা কখনও কখনও তারা লগ ব্লক try catch করার মত লগ ফাইল লগিং তথ্য লিখুন

try
{
  //do some work
}
catch(Exception exception)
{
   WriteException2LogFile(exception);
}

আমি শুধু ভাবছি, তারা যা করেছেন তা সর্বোত্তম অনুশীলন? এটা আমাকে বিভ্রান্ত করে তোলে কারণ আমার চিন্তা ব্যবহারকারীদের অবশ্যই সিস্টেমের সাথে কী ঘটতে হবে তা জানা উচিত।

আমাকে কিছু উপদেশ দিন দয়া করে।


আপনি ব্যতিক্রম জন্য এই ডিজাইন নির্দেশিকা বিবেচনা করা উচিত

  • ব্যতিক্রম হ্রাস
  • স্ট্যান্ডার্ড ব্যতিক্রম ধরনের ব্যবহার করে
  • ব্যতিক্রম এবং পারফরম্যান্স

https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/exceptions


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


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

  • ব্যতিক্রমটি কেন নিক্ষেপ করা যায় তা সম্পর্কে আপনার কাছে ভাল ধারণা রয়েছে এবং আপনি একটি নির্দিষ্ট পুনরুদ্ধার বাস্তবায়ন করতে পারেন যেমন, যখন আপনি FileNotFoundException বস্তুটি ধরেন তখন ব্যবহারকারী একটি নতুন ফাইলের নাম প্রবেশ করতে উত্সাহিত করে।

  • আপনি একটি নতুন, আরো নির্দিষ্ট ব্যতিক্রম তৈরি এবং নিক্ষেপ করতে পারেন।

int GetInt(int[] array, int index)
{
    try
    {
        return array[index];
    }
    catch(System.IndexOutOfRangeException e)
    {
        throw new System.ArgumentOutOfRangeException(
            "Parameter index is out of range.");
    }
}
  • আপনি অতিরিক্ত হ্যান্ডলিং জন্য এটি পাস করার আগে আংশিকভাবে একটি ব্যতিক্রম হ্যান্ডেল করতে চান। নিচের উদাহরণে ব্যতিক্রমটি পুনঃ-নিক্ষেপ করার আগে একটি ত্রুটি লগে একটি এন্ট্রি যোগ করার জন্য একটি ক্যাচ ব্লক ব্যবহার করা হয়।
    try
{
    // Try to access a resource.
}
catch (System.UnauthorizedAccessException e)
{
    // Call a custom error logging procedure.
    LogError(e);
    // Re-throw the error.
    throw;     
}

আমি সম্পূর্ণ " ব্যতিক্রম এবং ব্যতিক্রম হ্যান্ডলিং " অধ্যায় পড়া এবং ব্যতিক্রম জন্য শ্রেষ্ঠ অভ্যাস পড়তে সুপারিশ।


একটি ব্যতিক্রম একটি ব্লকিং ত্রুটি

সর্বোপরি, সর্বোত্তম অনুশীলনটি কোনও ত্রুটির জন্য ব্যতিক্রমগুলি নিক্ষেপ করা উচিত নয়, যদি না এটি একটি অবরোধকারী ত্রুটি না হয়

ত্রুটি ব্লক করা হয় , তাহলে ব্যতিক্রম নিক্ষেপ। ব্যতিক্রমটি ইতিমধ্যে নিক্ষেপ করা হলে, এটি লুকানোর কোন প্রয়োজন নেই কারণ এটি ব্যতিক্রম। ব্যবহারকারীকে এটি সম্পর্কে জানতে দিন (আপনি UI এ ব্যবহারকারীর জন্য দরকারী কিছু সম্পূর্ণ ব্যতিক্রম পুনর্বিবেচনা করা উচিত)।

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

উদাহরণস্বরূপ, যদি আপনি জানেন যে কিছু পূর্ণসংখ্যা ইনপুট অবৈধ ফর্ম্যাটের সাথে আসতে পারে তবে int.TryParse পরিবর্তে int.TryParse ব্যবহার করুন। এমন অনেক ক্ষেত্রেই আছে যেখানে আপনি এটি "এটি ব্যর্থ হলে কেবল একটি ব্যতিক্রম নিক্ষেপ করুন" বলার পরিবর্তে এটি করতে পারেন।

ব্যতিক্রম হ্রাস ব্যয়বহুল।

যদি, সবশেষে, একটি ব্যতিক্রম নিক্ষেপ করা হয়, এটি একবার নিক্ষেপ করা হলে লগের ব্যতিক্রমটি লেখার পরিবর্তে, সর্বোত্তম অনুশীলনগুলির মধ্যে একটি এটি প্রথম সুযোগ ব্যতিক্রম হ্যান্ডলারে ধরা হয় । উদাহরণ স্বরূপ:

  • ASP.NET: Global.asax অ্যাপ্লিকেশন_অরর
  • অন্যান্য: অ্যাপডোমাইনফার্স্টচান্স এক্সক্সেশন ইভেন্ট

আমার অবস্থান হল স্থানীয় চেষ্টা / ক্যাচগুলি বিশেষ ক্ষেত্রে পরিচালনা করার জন্য উপযুক্ত যেখানে আপনি অন্য কোনও ব্যতিক্রম অনুবাদ করতে পারেন, অথবা যখন আপনি খুব, খুব, খুব, খুব বিশেষ ক্ষেত্রে এটির জন্য "নিঃশব্দ" করতে চান (একটি লাইব্রেরি বাগ পুরো বাগকে কাজে লাগানোর জন্য আপনাকে নিঃশব্দ করার জন্য একটি অপ্রাসঙ্গিক ব্যতিক্রম নিক্ষেপ করা)।

বাকি অংশের জন্য:

  • ব্যতিক্রম এড়াতে চেষ্টা করুন।
  • যদি এটি সম্ভব না হয় তবে প্রথম সুযোগ ব্যতিক্রম হ্যান্ডলারগুলি।
  • অথবা একটি পোস্টশারপ দৃষ্টিভঙ্গি ব্যবহার করুন (AOP)।

@ তৌহিহাইটাম্বিতকে কিছু মন্তব্যের জবাব দেওয়া হচ্ছে ...

@ তৌহিহাইটাম্বিত বলেছেন:

ব্যতিক্রমগুলি মারাত্মক-ত্রুটি নয়, তারা ব্যতিক্রম! কখনও কখনও তারা এমনকি ত্রুটি হয় না, কিন্তু তাদের বিবেচনা করতে মারাত্মক ত্রুটিগুলি কি ব্যতিক্রমগুলির সম্পূর্ণ মিথ্যা বোঝা।

সর্বোপরি, কিভাবে একটি ব্যতিক্রম এমনকি একটি ত্রুটি হতে পারে না?

  • কোন ডাটাবেস সংযোগ => ব্যতিক্রম।
  • অবৈধ স্ট্রিং বিন্যাস কিছু টাইপ => ব্যতিক্রম পার্স করতে
  • JSON বিশ্লেষণ করার চেষ্টা করছে এবং ইনপুট আসলে JSON => ব্যতিক্রম নয়
  • বস্তু প্রত্যাশিত ছিল যখন আর্গুমেন্ট নিল => ব্যতিক্রম
  • কিছু লাইব্রেরি একটি বাগ => একটি অপ্রত্যাশিত ব্যতিক্রম ছুড়ে ফেলে
  • একটি সকেট সংযোগ আছে এবং এটি সংযোগ বিচ্ছিন্ন হয়ে যায়। তারপর আপনি একটি বার্তা => ব্যতিক্রম পাঠানোর চেষ্টা করুন
  • ...

আমরা ব্যতিক্রমের 1k ক্ষেত্রে তালিকাভুক্ত করা হতে পারে, এবং সর্বোপরি, সম্ভাব্য কোন ক্ষেত্রে একটি ত্রুটি হতে পারে।

ব্যতিক্রমটি একটি ত্রুটি, কারণ দিনের শেষে এটি একটি বস্তু যা ডায়গনিস্টিক তথ্য সংগ্রহ করে - এটি একটি বার্তা থাকে এবং কিছু ঘটে গেলে এটি ঘটে।

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

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

[...] তাদের বিবেচনা করুন মারাত্মক ত্রুটিগুলি কোন ব্যতিক্রমগুলির সম্পূর্ণ মিথ্যা বোঝা।

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

@ তৌহীহাইটাম্বিত সম্পর্কে আরো জবাব

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

  1. যদি আপনার অ্যাপ্লিকেশন ডেটাবেসে ডেটা স্থির না করে অফলাইনে কাজ করতে পারে, তবে আপনাকে ব্যতিক্রমগুলি ব্যবহার করতে হবে না, যেহেতু try/catch ব্যবহার try/catch কন্ট্রোল প্রবাহটি বাস্তবায়ন করা একটি অ্যান্টি-প্যাটার্ন হিসাবে বিবেচিত হয়। অফলাইন কাজ একটি সম্ভাব্য ব্যবহার কেস, তাই আপনি ডাটাবেস অ্যাক্সেসযোগ্য কিনা তা পরীক্ষা করার জন্য নিয়ন্ত্রণ প্রবাহ প্রয়োগ করুন, আপনি এটি অ্যাক্সেসযোগ্য না হওয়া পর্যন্ত অপেক্ষা করবেন না

  2. প্যারিসিং জিনিস এছাড়াও একটি প্রত্যাশিত ক্ষেত্রে (অতিরিক্ত মামলা নয় )। আপনি যদি এটি আশা করেন, আপনি নিয়ন্ত্রণ প্রবাহ করতে ব্যতিক্রম ব্যবহার করবেন না! । আপনি ব্যবহারকারীর কাছ থেকে কিছু মেটাডেটা জানতে পারেন তার সংস্কৃতি কী এবং আপনি এর জন্য ফরম্যাটার ব্যবহার করেন! .NET এই এবং অন্যান্য পরিবেশগুলিকেও সমর্থন করে এবং একটি ব্যতিক্রম কারণ আপনার অ্যাপ্লিকেশন / পরিষেবাদির সংস্কৃতির নির্দিষ্ট ব্যবহারের প্রত্যাশা করলে সংখ্যা বিন্যাস এড়ানো উচিত

একটি unhandled ব্যতিক্রম সাধারণত একটি ত্রুটি হয়ে যায়, কিন্তু ব্যতিক্রম নিজেই কোডproject.com হয় না। আর্টিকেল 15921 / নোট- সমস্ত- ব্যতিক্রমসমূহ - আরে- Errors

এই নিবন্ধটি শুধুমাত্র একটি মতামত বা লেখকের দৃষ্টিভঙ্গি।

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

[...] এই ব্যতিক্রমগুলি ব্যবহার করে প্রোগ্রামটি চালিয়ে যাওয়ার জন্য নির্দিষ্ট ত্রুটিগুলি পরিচালনা করার জন্য ব্যতিক্রম দ্বারা কোডিং বলা হয়। এই বিরোধী-প্যাটার্ন দ্রুত কর্মক্ষমতা এবং maintainability মধ্যে সফ্টওয়্যার হ্রাস করতে পারেন।

এটা কোথাও বলে:

ভুল ব্যতিক্রম ব্যবহার

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

সত্যিকার অর্থে, আমি বিশ্বাস করি যে সফটওয়্যারগুলি উন্নত করা যাবে না গুরুত্ব সহকারে ব্যবহার ক্ষেত্রে না। আপনি যদি জানেন যে ...

  • আপনার ডাটাবেস অফলাইন যেতে পারেন ...
  • কিছু ফাইল লক করা যাবে ...
  • কিছু ফর্ম্যাটিং সমর্থিত হতে পারে না ...
  • কিছু ডোমেইন বৈধতা ব্যর্থ হতে পারে ...
  • আপনার অ্যাপ্লিকেশন অফলাইন মোডে কাজ করা উচিত ...
  • যাই হোক না কেন কেস ব্যবহার ...

... আপনি যে জন্য ব্যতিক্রম ব্যবহার করবেন না । আপনি নিয়মিত নিয়ন্ত্রণ প্রবাহ ব্যবহার করে এই ব্যবহার ক্ষেত্রে সমর্থন করবে।

এবং যদি কিছু অপ্রত্যাশিত ব্যবহার কেস আচ্ছাদিত না হয়, আপনার কোড দ্রুত ব্যর্থ হবে, কারণ এটি একটি ব্যতিক্রম নিক্ষেপ করবে । অধিকার, একটি ব্যতিক্রম একটি ব্যতিক্রমী ক্ষেত্রে কারণ।

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


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

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

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


কোন আর্গুমেন্ট ছাড়া catch কেবল ব্যতিক্রম খাওয়া এবং কোন ব্যবহার হয়। একটি মারাত্মক ত্রুটি ঘটলে কি হবে? আপনি যদি যুক্তি ছাড়াই ধরা ব্যবহার করেন তবে কী ঘটেছে তা জানার কোন উপায় নেই।

একটি ধরা বিবৃতিটি অবশ্যই FileNotFoundException মত আরো নির্দিষ্ট ব্যতিক্রমগুলি ধরতে হবে এবং তারপরে আপনাকে অবশ্যই Exception ধরা উচিত যা অন্য কোনো ব্যতিক্রম ধরবে এবং তাদের লগ ইন করবে।


দ্বিতীয় পদ্ধতির একটি ভাল এক।

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

try
{
  //do some work
}
catch(Exception exception)
{
   WriteException2LogFile(exception);//it will write the or log the error in a text file
}

আমি আপনার পুরো আবেদন জন্য দ্বিতীয় পদ্ধতির জন্য যান যে সুপারিশ।


ফাঁকা ধরা ব্লক ছেড়ে খারাপ জিনিস। যদি ত্রুটি থাকে তবে এটি পরিচালনা করার সেরা উপায় হল:

  1. ফাইল \ ডাটাবেস ইত্যাদিতে লগ ইন করুন ..
  2. উড়ে এটি ঠিক করার চেষ্টা করুন (সম্ভবত যে অপারেশন করার বিকল্প উপায় চেষ্টা)
  3. আমরা যদি এটি ঠিক করতে না পারি, ব্যবহারকারীকে অবহিত করুন যে কিছু ত্রুটি আছে এবং অবশ্যই অপারেশনটি বাতিল করুন

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


সেরা অনুশীলন ব্যতিক্রম হ্যান্ডলিং বিষয় গোপন করা উচিত নয় । এই try-catch ব্লক অত্যন্ত বিরল হওয়া উচিত।

একটি try-catch ব্যবহার করে যেখানে 3 পরিস্থিতিতে জ্ঞান করে তোলে।

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

  2. যদি আপনাকে ব্যতিক্রমের জন্য কিছু করতে হয় (উদাহরণস্বরূপ লগিং বা লেনদেনটি ফেরত পাঠান) তবে ব্যতিক্রমটি পুনরায় ফরোয়ার্ড করুন।

  3. অজানা ব্যতিক্রমগুলি সর্বদা উচ্চ-আপ হিসাবে আপনি করতে পারেন - একমাত্র কোড যা একটি ব্যতিক্রমকে গ্রাস করবে এবং পুনরায় ফরোয়ার্ড করবে না তা UI বা সার্বজনিক API হওয়া উচিত।

ধরুন আপনি একটি দূরবর্তী API এ সংযোগ করছেন, এখানে আপনি কিছু ত্রুটি (এবং সেই পরিস্থিতিতে জিনিসগুলি আছে) আশা করতে জানেন, তাই এটি হল 1:

try 
{
    remoteApi.Connect()
}
catch(ApiConnectionSecurityException ex) 
{
    // User's security details have expired
    return false;
}

return true;

মনে রাখবেন যে অন্য কোনও ব্যতিক্রম ধরা পড়ে না, যেমনটি প্রত্যাশিত নয়।

এখন অনুমান করুন যে আপনি ডাটাবেসের কিছু সংরক্ষণ করার চেষ্টা করছেন। যদি এটি ব্যর্থ হয় তবে আমাদের এটি আবার চালু করতে হবে, তাই আমাদের কেস 2:

try
{
    DBConnection.Save();
}
catch
{
    // Roll back the DB changes so they aren't corrupted on ANY exception
    DBConnection.Rollback();

    // Re-throw the exception, it's critical that the user knows that it failed to save
    throw;
}

নোট করুন যে আমরা ব্যতিক্রমটি পুনরায় নিক্ষেপ করি - উচ্চতর কোডটি এখনও জানা দরকার যে কিছু ব্যর্থ হয়েছে।

অবশেষে আমাদের কাছে UI রয়েছে - এখানে আমরা সম্পূর্ণরূপে ব্যতিক্রমহীন ব্যতিক্রমগুলি চাই না, তবে আমরা তাদের লুকাতেও চাই না। এখানে আমরা কেস 3 একটি উদাহরণ আছে:

try
{
    // Do something
}
catch(Exception ex) 
{
    // Log exception for developers
    WriteException2LogFile(ex);

    // Display message to users
    DisplayWarningBox("An error has occurred, please contact support!");
}

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

এর অর্থ হল কেস 1 (পরিচিত ব্যতিক্রমসমূহ) এবং কেস 3 (এক-অফ UI হ্যান্ডলিং) উভয়ই ভাল নিদর্শন রয়েছে (প্রত্যাশিত ত্রুটি বা UI ত্রুটিটিকে হ্যান্ডলিংয়ের হাত থেকে রক্ষা করা) এড়িয়ে চলুন।

এমনকি কেস 2 ভাল প্যাটার্ন দ্বারা প্রতিস্থাপিত হতে পারে, উদাহরণস্বরূপ লেনদেনের স্কোপগুলি (ব্লকগুলির সময় যে কোনও লেনদেন না করে রোলব্যাকগুলি using ) এটি বিকাশকারীদের সর্বোত্তম অনুশীলনের প্যাটার্নটি ভুল করতে কঠিন করে তোলে।

উদাহরণস্বরূপ ধরুন আপনার কাছে একটি বৃহত স্কেল ASP.Net অ্যাপ্লিকেশন আছে। ত্রুটি লগিং ELMAH এর মাধ্যমে হতে পারে, ত্রুটির প্রদর্শন স্থানীয়ভাবে একটি তথ্যপূর্ণ YSoD এবং উত্পাদনে একটি চমৎকার স্থানীয় বার্তা হতে পারে। ডাটাবেস সংযোগ সমস্ত লেনদেন scopes এবং ব্লক using হতে পারে। আপনি একটি একক try-catch ব্লকের প্রয়োজন নেই।

টিএল; ডিআর: সেরা অনুশীলন আসলেই try-catch ব্লকগুলি ব্যবহার try-catch জন্য নয়।





try-catch