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




.net exception (12)

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

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


ত্রুটিটি ঘটে যখন সর্বোত্তম অনুশীলন একটি ব্যতিক্রম নিক্ষেপ করা হয়। কারণ একটি ত্রুটি ঘটেছে এবং এটি লুকানো উচিত নয়।

কিন্তু বাস্তব জীবনে আপনি যখন এটি লুকাতে চান তখন বিভিন্ন পরিস্থিতিতে থাকতে পারে

  1. আপনি তৃতীয় পক্ষের উপাদান উপর নির্ভর এবং আপনি ত্রুটি ক্ষেত্রে প্রোগ্রাম অবিরত করতে চান।
  2. আপনার কোনও ব্যবসায়িক কেস আছে যা আপনাকে ত্রুটির ক্ষেত্রে অবিরত রাখতে হবে

আমার ব্যতিক্রম হ্যান্ডলিং কৌশল হল:

  • Application.ThreadException event ThreadException Application.ThreadException event hooking দ্বারা সব unhandled ব্যতিক্রম ধরা, তারপর সিদ্ধান্ত:

    • একটি UI অ্যাপ্লিকেশনের জন্য: ব্যবহারকারীকে ক্ষমাপ্রার্থী বার্তা সহ পপ করতে (winforms)
    • একটি পরিষেবা বা কনসোল অ্যাপ্লিকেশনের জন্য: এটি একটি ফাইলে লগ ইন করুন (পরিষেবা বা কনসোল)

তারপর আমি সর্বদা কোডের প্রতিটি অংশকে ঘিরে রাখি যা try/catch বাহ্যিকভাবে চালানো হয় :

  • Winforms অবকাঠামো দ্বারা চালিত সমস্ত ঘটনা (লোড, ক্লিক, নির্বাচিত Changed ...)
  • সমস্ত ঘটনা তৃতীয় পক্ষের উপাদান দ্বারা বহিস্কার

তারপর আমি 'চেষ্টা / ধরা' মধ্যে ঘিরা

  • সমস্ত অপারেশন যা আমি জানি সব সময় কাজ করবে না (আইও অপারেশনস, সম্ভাব্য শূন্য বিভাগের সাথে গণনা ...)। এই ক্ষেত্রে, আমি কি সত্যিই ঘটেছে ট্র্যাক রাখতে একটি নতুন ApplicationException("custom message", innerException) নিক্ষেপ

উপরন্তু, আমি ব্যতিক্রম সঠিকভাবে সাজানোর আমার যথাসাধ্য চেষ্টা। ব্যতিক্রম আছে যা:

  • অবিলম্বে ব্যবহারকারী দেখানো প্রয়োজন
  • ক্যাসকেডিং সমস্যা এড়ানোর জন্য যখন তারা একসাথে জিনিসগুলি একত্রিত করার জন্য কিছু অতিরিক্ত প্রক্রিয়াকরণ প্রয়োজন (অর্থাতঃ: একটি TreeView পূরণের সময় finally অংশে শেষ করুন)
  • ব্যবহারকারী যত্ন না, কিন্তু কি ঘটেছে তা জানা গুরুত্বপূর্ণ। তাই আমি সবসময় তাদের লগ:

    • ঘটনা লগ ইন
    • অথবা ডিস্কে একটি .log ফাইল

অ্যাপ্লিকেশন শীর্ষ স্তরের ত্রুটি হ্যান্ডলারগুলিতে ব্যতিক্রমগুলিকে হ্যান্ডেল করার জন্য কিছু স্ট্যাটিক পদ্ধতি ডিজাইন করা এটি ভাল অনুশীলন।

আমি নিজেকে চেষ্টা করার জন্য বলছি:

  • মনে রাখবেন সব ব্যতিক্রম শীর্ষ স্তরের আপ বুদবুদ করা হয় । এটা সর্বত্র ব্যতিক্রম হ্যান্ডলার রাখা প্রয়োজন হয় না।
  • পুনঃব্যবহারযোগ্য বা গভীর ফাংশনগুলিকে ডিসপ্লেগুলি প্রদর্শন বা লগ করার প্রয়োজন নেই: এটিগুলি স্বয়ংক্রিয়ভাবে আপগ্রেড করা হয় বা আমার ব্যতিক্রম হ্যান্ডলারগুলিতে কিছু কাস্টম বার্তাগুলির সাথে পুনঃস্থাপন করা হয়।

তাই অবশেষে:

খারাপ:

// DON'T DO THIS, ITS BAD
try
{
    ...
}
catch 
{
   // only air...
}

বেহুদা:

// DONT'T DO THIS, ITS USELESS
try
{
    ...
}
catch(Exception ex)
{
    throw ex;
}

একটি ধরা ছাড়া অবশেষে একটি চেষ্টা হচ্ছে পুরোপুরি বৈধ:

try
{
    listView1.BeginUpdate();

    // If an exception occurs in the following code, then the finally will be executed
    // and the exception will be thrown
    ...
}
finally
{
    // I WANT THIS CODE TO RUN EVENTUALLY REGARDLESS AN EXCEPTION OCCURED OR NOT
    listView1.EndUpdate();
}

আমি শীর্ষ স্তরে কি কি:

// i.e When the user clicks on a button
try
{
    ...
}
catch(Exception ex)
{
    ex.Log(); // Log exception

    -- OR --

    ex.Log().Display(); // Log exception, then show it to the user with apologies...
}

আমি ফাংশন বলা কিছু কি করবেন:

// Calculation module
try
{
    ...
}
catch(Exception ex)
{
    // Add useful information to the exception
    throw new ApplicationException("Something wrong happened in the calculation module :", ex);
}

// IO module
try
{
    ...
}
catch(Exception ex)
{
    throw new ApplicationException(string.Format("I cannot write the file {0} to {1}", fileName, directoryName), ex);
}

ব্যতিক্রম হ্যান্ডলিং (কাস্টম এক্সপেশন্স) এর সাথে অনেক কিছু করার আছে কিন্তু আমি মনে রাখতে পারি এমন নিয়মগুলি হ্রাস করে যা সহজ অ্যাপ্লিকেশনের জন্য যথেষ্ট।

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

// Usage:

try
{
    // boom
}
catch(Exception ex)
{
    // Only log exception
    ex.Log();

    -- OR --

    // Only display exception
    ex.Display();

    -- OR --

    // Log, then display exception
    ex.Log().Display();

    -- OR --

    // Add some user-friendly message to an exception
    new ApplicationException("Unable to calculate !", ex).Log().Display();
}

// Extension methods

internal static Exception Log(this Exception ex)
{
    File.AppendAllText("CaughtExceptions" + DateTime.Now.ToString("yyyy-MM-dd") + ".log", DateTime.Now.ToString("HH:mm:ss") + ": " + ex.Message + "\n" + ex.ToString() + "\n");
    return ex;
}

internal static Exception Display(this Exception ex, string msg = null, MessageBoxImage img = MessageBoxImage.Error)
{
    MessageBox.Show(msg ?? ex.Message, "", MessageBoxButton.OK, img);
    return ex;
}

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

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

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

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


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

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

ত্রুটি ব্লক করা হয় , তাহলে ব্যতিক্রম নিক্ষেপ। ব্যতিক্রমটি ইতিমধ্যে নিক্ষেপ করা হলে, এটি লুকানোর কোন প্রয়োজন নেই কারণ এটি ব্যতিক্রম। ব্যবহারকারীকে এটি সম্পর্কে জানতে দিন (আপনি 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{
    //Some code here
}
catch(DivideByZeroException dz){
    AlerUserDivideByZerohappened();
}
catch(Exception e){
    treatGeneralException(e);
}
finally{
    //if a IO operation here i close the hanging handlers for example
}

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


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

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

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


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

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

কখনও কখনও আপনি ব্যবহারকারীদের কিছুই বলে ব্যতিক্রম ব্যতিক্রম আচরণ প্রয়োজন।

আমার উপায় হল:

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

এটা স্পষ্টভাবে ভাল অনুশীলন হতে হবে না। ;-)





try-catch