সি # তে চেষ্টা / ধরার আসল ওভারহেড কী?


94

সুতরাং, আমি জানি যে চেষ্টা / ধরা কিছু ওভারহেড যুক্ত করে এবং তাই প্রক্রিয়া প্রবাহ নিয়ন্ত্রণের একটি ভাল উপায় নয়, তবে এই ওভারহেডটি কোথা থেকে আসে এবং এটির প্রকৃত প্রভাব কী?

উত্তর:


52

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

আমি মনে করি না যতক্ষণ আপনি এক্সসিপলিট আচরণের জন্য ব্যতিক্রম ব্যবহার করছেন (তাই প্রোগ্রামের মাধ্যমে আপনার আদর্শ, প্রত্যাশিত পথ নয়) it's


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

4
হুঁ - চিহ্ন আপ মন্তব্যগুলিতে কাজ করে না। আবার চেষ্টা করার জন্য - ব্যতিক্রমগুলি ত্রুটিগুলির জন্য, "ব্যতিক্রমী আচরণ" বা শর্তের জন্য নয়: ব্লগস.এমএসডন.কম.ওয়ানা
HTTP 410

4
@ উইন্ডো প্রোগ্রামার পরিসংখ্যান / উত্স দয়া করে?
কাপ

100

এখানে তিনটি পয়েন্ট:

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

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

  • আমি বিশ্বাস করি যে এই কারণগুলির মধ্যে একটি সাধারণ কারণ আপনি যদি ব্যতিক্রমটি পুনর্বিবেচনা করতে যাচ্ছেন throw;তবে ব্যতিক্রমটি আবার ফেলে দেওয়া বা একটি নতুন নির্মাণ করা যেমন সেই ক্ষেত্রে স্ট্যাকের সমস্ত তথ্যই আবার জমা দেওয়া হয়েছে তবে সাধারণ এটি সব সংরক্ষণ করা হয়।


41
এছাড়াও: আপনি যখন "থ্রো প্রাক্তন" হিসাবে একটি ব্যতিক্রম পুনর্বিবেচনা করেন তখন আপনি মূল স্ট্যাক ট্রেসটি হারাবেন এবং এটিকে বর্তমান স্ট্যাক ট্রেসের সাথে প্রতিস্থাপন করবেন; খুব কমই যা চেয়েছিল যদি আপনি কেবল "নিক্ষেপ" করেন তবে ব্যতিক্রমের মূল স্ট্যাক ট্রেসটি সংরক্ষণ করা হয়।
এডি

@ এডি বাthrow new Exception("Wrapping layer’s error", ex);
বিনকি

21

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

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

    • উদাহরণস্বরূপ, ব্যতিক্রম ছুঁড়ে ফেলতে সিএলআরকে শেষ অবধি অবস্থানের সন্ধান করতে এবং বর্তমান আইপি এবং প্রতিটি ফ্রেমের রিটার্ন আইপির উপর ভিত্তি করে ব্লকগুলি ধরতে হবে যতক্ষণ না ব্যতিক্রমটি পরিচালনা করা হয় ফিল্টার ব্লক।
    • মেটাডেটা পড়া সহ ডায়াগনস্টিক উদ্দেশ্যে ফ্রেম তৈরি করতে অতিরিক্ত নির্মাণ ব্যয় এবং নাম রেজোলিউশন
    • উপরের দুটি আইটেমই সাধারণত "ঠান্ডা" কোড এবং ডেটা অ্যাক্সেস করে, তাই আপনার যদি মেমরির চাপ থাকে তবে হার্ড পৃষ্ঠার ফল্টগুলি সম্ভাব্য:

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

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


6

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

bool HasRight(string rightName, DomainObject obj) {
  try {
    CheckRight(rightName, obj);
    return true;
  }
  catch (Exception ex) {
    return false;
  }
}

void CheckRight(string rightName, DomainObject obj) {
  if (!_user.Rights.Contains(rightName))
    throw new Exception();
}

পরীক্ষার ডেটাবেস যখন পরীক্ষার ডেটা দিয়ে পূর্ণ হয়ে ওঠে, তখন নতুন ফর্মগুলি খোলার সময় এটি খুব দৃশ্যমান মন্দার দিকে যায় etc.

সুতরাং আমি এটি নিম্নলিখিতটির সাথে রিফ্যাক্টর করেছি, যা - পরে তাত্ক্ষণিকভাবে 'n নোংরা পরিমাপ অনুসারে - প্রায় 2 মাপের অর্ডার দ্রুত হয়:

bool HasRight(string rightName, DomainObject obj) {
  return _user.Rights.Contains(rightName);
}

void CheckRight(string rightName, DomainObject obj) {
  if (!HasRight(rightName, obj))
    throw new Exception();
}

সুতরাং সংক্ষেপে, স্বাভাবিক প্রক্রিয়া প্রবাহে ব্যতিক্রমগুলি ব্যবহারের ব্যতিক্রমীতা প্রায় দুই অর্ডার কম হয় তবে ব্যতিক্রম ছাড়াই অনুরূপ প্রক্রিয়া প্রবাহ ব্যবহার করা হয়।


4
আপনি এখানে কেন একটি ব্যতিক্রম নিক্ষেপ করতে চান? আপনি ঘটনাস্থলে অধিকার না থাকার কেসটি পরিচালনা করতে পারেন।
থান্ডারগ্রি

@ থান্ডার জিআর আসলে এটিই আমি পরিবর্তন করেছিলাম, এটি এটিকে দুটি মাত্রার দ্রুততর করে তোলে।
টবি

5

সাধারণত গৃহীত তত্ত্বগুলির বিপরীতে try/ / এর catchউল্লেখযোগ্য পারফরম্যান্সের প্রভাব থাকতে পারে এবং এটি ব্যতিক্রম ছুঁড়ে দেওয়া হয় বা না!

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

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

এর রয়েছে এই উত্তরটি যা with- এবং ব্যবহার না করেই অনেকত্রিত কোড মধ্যে পার্থক্য দেখায় try/ catch

এটি তাই সুস্পষ্ট বলে মনে হয় যে হয় একটি ওভারহেড যা কোড প্রজন্মে blatantly পর্যবেক্ষণযোগ্য, এবং যে ওভারহেড এমনকি যারা মাইক্রোসফট মান মানুষ স্বীকার করা বলে মনে হয়! তবুও আমি, ইন্টারনেট পুনরাবৃত্তি করছি ...

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


আমি বহু বছর আগে একটি উত্তর পোস্ট করেছি যা এটি প্রোগ্রামারগুলির উত্পাদনশীলতার (ম্যাক্রো-অপ্টিমাইজেশন) উপর ফোকাস করার সাথে সাথে মুছে ফেলা হয়েছে।

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

স্পষ্টতই, আমাদের কোডগুলি নয়, আমাদের অগ্রাধিকারগুলি অনুকূল করা উচিত ! আমার শেষ উত্তরে আমি কোডের দুটি স্নিপেটের মধ্যে পার্থক্যটি আকর্ষণ করেছি।

ব্যবহার try/ catch:

int x;
try {
    x = int.Parse("1234");
}
catch {
    return;
}
// some more code here...

ব্যবহার করছেন না try/ catch:

int x;
if (int.TryParse("1234", out x) == false) {
    return;
}
// some more code here

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

যেহেতু আরও বেশি ক্ষেত্র একটি শ্রেণিতে প্রবর্তিত হয়েছে, এই সমস্ত বয়লারপ্লেট আবর্জনা যুক্তিসঙ্গত স্তরের বাইরেও উত্স (উত্স এবং বিচ্ছিন্ন কোড উভয় ক্ষেত্রে) জমে। ক্ষেত্রের জন্য চারটি অতিরিক্ত লাইন, এবং সেগুলি সর্বদা একই লাইন হয় ... আমরা কী নিজেদের পুনরাবৃত্তি এড়াতে শেখানো হয়নি? আমি আমরা লুকিয়ে পারে অনুমান করা try/ catchকিছু বাড়িতে brewed বিমূর্ততা পিছনে, কিন্তু ... তারপর আমরা হিসাবে ভাল শুধু এড়াতে পারে ব্যতিক্রম (অর্থাত ব্যবহার Int.TryParse)।

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

ধারনা করে কনস্ট্রাক্টর একটি ব্যতিক্রম নিক্ষেপ করেছেন এবং ফলস্বরূপ কিছু বাগ ট্রিগার করা হয়েছে, দরিদ্র রক্ষণাবেক্ষণ বিকাশকারীকে তারপরে এটি অনুসরণ করতে হবে। এটি এত সহজ কাজ নাও হতে পারে, যেমন গোটো দুঃস্বপ্নের স্প্যাগেটি কোডের বিপরীতে , try/ তিন মাত্রায়catch জঞ্জাল সৃষ্টি করতে পারে , কারণ এটি স্ট্যাকটিকে কেবল একই পদ্ধতির অন্যান্য অংশগুলিতে নয়, অন্যান্য শ্রেণি ও পদ্ধতিতেও স্থান দিতে পারে could যার সবগুলি রক্ষণাবেক্ষণ বিকাশকারী দ্বারা পর্যবেক্ষণ করা হবে, শক্ত উপায় ! তবুও আমাদের বলা হয়েছে যে "গোটো বিপজ্জনক", হি!

শেষে আমি উল্লেখ করছি, try/ catchএর সুবিধা রয়েছে যা এটি অপটিমাইজেশন অক্ষম করার জন্য তৈরি করা হয়েছে ! এটি, যদি আপনি চান, একটি ডিবাগিং সহায়তা ! এটিই এটির জন্য ডিজাইন করা হয়েছিল এবং এটি এটি হিসাবে ব্যবহার করা উচিত ...

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


কি optimisations না try, catchএবং finallyঅক্ষম করবেন?

একে

কেমন আছেন try, catchএবং finallyএইডস ডিবাগ হিসাবে দরকারী?

তারা লেখার বাধা। এটি স্ট্যান্ডার্ড থেকে আসে:

12.3.3.13 চেষ্টা-ধরার বিবৃতি

ফর্মের স্ট্যাম্টের বিবৃতিতে :

try try-block
catch ( ... ) catch-block-1
... 
catch ( ... ) catch-block-n
  • ট্রাই -ব্লকের শুরুতে v এর নির্দিষ্ট অ্যাসাইনমেন্ট স্টেট স্ট্যামিটের শুরুতে ভি এর নির্দিষ্ট অ্যাসাইনমেন্ট স্টেটের সমান ।
  • এর নির্দিষ্ট নিয়োগ রাষ্ট্র বনাম শুরুতে ক্যাচ-Block-I (যে কোন জন্য আমি ) এর নির্দিষ্ট নিয়োগ রাষ্ট্র হিসাবে একই বনাম শুরুতে stmt
  • স্ট্যাম্টের শেষ-বিন্দুতে ভি এর সুনির্দিষ্ট অ্যাসাইনমেন্ট অবস্থা অবশ্যই নির্ধারিত হয় যদি (এবং কেবলমাত্র) ভি অবশ্যই স্পষ্ট -ব্লকের শেষ পয়েন্টে নির্ধারিত হয় এবং প্রতিটি ক্যাচ-ব্লক -১ (প্রতিটি আই-এর 1 থেকে এন পর্যন্ত) )।

অন্য কথায়, প্রতিটি tryবক্তব্যের শুরুতে :

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

একই বিবরণ প্রতিটি catchবিবৃতি জন্য ধারণ করে ; ধরুন আপনার tryবিবৃতিটির মধ্যে (বা কোনও নির্মাণকারীর দ্বারা কাজ করা বা এটি আহবান করা ইত্যাদি) আপনি অন্যথায় অর্থহীন ভেরিয়েবলের জন্য নির্ধারিত করেছেন (আসুন বলে নেওয়া যাক garbage=42;), সংকলক প্রোগ্রামটির পর্যবেক্ষণযোগ্য আচরণের সাথে যতই অপ্রাসঙ্গিক হোক না কেন, বিবৃতিটি মুছে ফেলতে পারে না matter । ব্লক প্রবেশের আগে অ্যাসাইনমেন্টটি সম্পন্ন হওয়া দরকার catch

এটির মূল্য কীসের জন্য, finallyএকইভাবে হ্রাসকারী গল্পটি বলে :

12.3.3.14 শেষ অবধি বিবৃতি চেষ্টা করুন

একটি জন্য ব্যবহার করে দেখুন বিবৃতি stmt ফর্মের:

try try-block
finally finally-block

Try চেষ্টা-ব্লকের শুরুতে v এর সুনির্দিষ্ট অ্যাসাইনমেন্ট স্টেট স্ট্যামিটের শুরুতে ভি এর নির্দিষ্ট অ্যাসাইনমেন্ট স্টেটের সমান । Finally অবশেষে-ব্লকের শুরুতে ভি এর সুনির্দিষ্ট অ্যাসাইনমেন্ট স্টেট স্ট্যামিটের শুরুতে ভি এর নির্দিষ্ট অ্যাসাইনমেন্ট স্টেটের সমান । • এর নির্দিষ্ট নিয়োগ রাষ্ট্র বনাম শেষে দফা এ stmt স্পষ্টভাবে করেন (এবং কেবল যদি) নির্ধারিত হয় পারেন, হে বনাম স্পষ্টভাবে শেষে দফা এ নির্ধারিত হয় ব্যবহার করে দেখুন-ব্লকবনাম

অবশ্যই অবশেষে-ব্লকের শেষ পয়েন্টে নির্ধারিত হয় যদি কন্ট্রোল ফ্লো ট্রান্সফার (যেমন একটি গেটো স্টেটমেন্ট) তৈরি করা হয় যা চেষ্টা-ব্লকের মধ্যে শুরু হয় , এবং চেষ্টা-ব্লকের বাইরে শেষ হয় , তবে ভিটিকে অবশ্যই এতে নির্ধারিত হিসাবে বিবেচনা করা হবে নিয়ন্ত্রণ প্রবাহ স্থানান্তর যদি v অবশ্যই অবশেষে-ব্লকের শেষ-পয়েন্টে নির্ধারিত হয় । (এটি কেবলমাত্র যদি তা হয় না — যদি এই নিয়ন্ত্রণ প্রবাহের স্থানান্তরের বিষয়ে অন্য কোনও কারণে v কে অবশ্যই নির্ধারিত করা হয়, তবে এটি এখনও অবশ্যই নির্ধারিত হিসাবে বিবেচিত হয়))

12.3.3.15 চেষ্টা করুন-শেষের বক্তব্যগুলি

একটি চেষ্টা - ধরা - শেষ পর্যন্ত ফর্ম বিবৃতি জন্য চিরস্থায়ী নিয়োগ বিশ্লেষণ :

try try-block
catch ( ... ) catch-block-1
... 
catch ( ... ) catch-block-n
finally finally-block

এমনটি করা হয় যেন বিবৃতিটি চেষ্টা করা হয় - অবশেষে বিবৃতিটি একটি চেষ্টা - ধরার বিবৃতি আবদ্ধ করে :

try { 
    try   
    try-block
    catch ( ... ) catch-block-1
    ...   
    catch ( ... ) catch-block-n
} 
finally finally-block

3

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

সুতরাং এখানে লিখিত সমস্ত কিছুর উপসংহারে:
1) অপ্রত্যাশিত ত্রুটিগুলি ধরার জন্য চেষ্টা করুন .c
2) যদি আপনি এটি এড়াতে পারেন তবে ব্যতীত ত্রুটিযুক্ত ব্যতিক্রমগুলি ব্যবহার করবেন না।


3

আমি এই সম্পর্কে একটি নিবন্ধ লিখেছিলাম কিছুক্ষণ আগে কারণ এখানে অনেক লোক জিজ্ঞাসা করেছিল। আপনি এটি এবং পরীক্ষার কোডটি http://www.blackwasp.co.uk/SpeedTestTryCatch.aspx এ খুঁজে পেতে পারেন ।

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

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


2

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


আমি আপনার ব্লগে পৌঁছতে পারিনি (সংযোগের সময়সীমা শেষ হয়ে গেছে; আপনি কি try/ catchখুব বেশি ব্যবহার করছেন ? হি হি), তবে আপনি ভাষাগুলি এবং কিছু এমএস এমভিপি যারা এই বিষয়ে ব্লগ লিখেছেন, পরিমাপ সরবরাহ করে তাদের সাথে বিতর্ক করছেন বলে মনে হচ্ছে you আপনার পরামর্শের বিপরীতে ... আমি যে পরামর্শটি করেছি তা ভুল বলে আমি এই পরামর্শের জন্য উন্মুক্ত, তবে এটিতে কী বলছে তা দেখার জন্য আপনার ব্লগ এন্ট্রিটি পড়তে হবে।
অটিস্টিক

@ হাফথরের ব্লগ পোস্টের পাশাপাশি, গতির পারফরম্যান্সের পার্থক্যের পরীক্ষার জন্য কোড সহ একটি বিশেষ ব্লগ পোস্ট এখানে দেওয়া হয়েছে । ফলাফল অনুসারে, যদি আপনার ব্যতিক্রম ঘটে তবে মাত্র 5% সময় পাওয়া যায়, ব্যতিক্রম হ্যান্ডলিং কোডটি ব্যতিক্রমহীন হ্যান্ডলিং কোডের চেয়ে সামগ্রিকভাবে 100x ধীরে চালিত হয়। নিবন্ধটি বিশেষত try-catchব্লক বনাম tryparse()পদ্ধতিগুলিকে লক্ষ্যবস্তু করে , তবে ধারণাটি একই।

2

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

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

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


@ রিচার্ড টি, কেন? প্রোগ্রামার এবং মানের ওভারহেডের তুলনায় এটি তুচ্ছ ins
থান্ডারগ্রি

1

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

আমি বলব চেষ্টা ব্যবহার করতে দ্বিধা করবেন না। যখনই প্রয়োজন হয় তা ধরুন এবং এটি বুদ্ধিমানের সাথে ব্যবহার করুন!

উদাহরণস্বরূপ, এই পদ্ধতিটি একটি কর্মপ্রবাহে অংশ নেয় ...

মন্তব্য?

public bool DeleteGallery(int id)
{
    try
    {
        using (var transaction = new DbTransactionManager())
        {
            try
            {
                transaction.BeginTransaction();

                _galleryRepository.DeleteGallery(id, transaction);
                _galleryRepository.DeletePictures(id, transaction);

                FileManager.DeleteAll(id);

                transaction.Commit();
            }
            catch (DataAccessException ex)
            {
                Logger.Log(ex);
                transaction.Rollback();                        
                throw new BusinessObjectException("Cannot delete gallery. Ensure business rules and try again.", ex);
            }
        }
    }
    catch (DbTransactionException ex)
    {
        Logger.Log(ex);
        throw new BusinessObjectException("Cannot delete gallery.", ex);
    }
    return true;
}

4
ডেভিড, আপনি কি চেষ্টা / ক্যাচ ব্লকে 'ডিলিটগ্যালারি' তে কলটি গুটিয়ে রাখবেন?
রব

যেহেতু ডিলিটগ্যালারি একটি বুলিয়ান ফাংশন, তাই আমার কাছে মনে হয় যে সেখানে একটি ব্যতিক্রম ছুঁড়ে দেওয়া কার্যকর নয়। এর জন্য ডিলিটগ্যালারিতে কলটি চেষ্টা / ধরা ব্লকে আবদ্ধ থাকতে হবে। একটি যদি (! ডিলিটগ্যালারি (theid)) {// হ্যান্ডেল me আমার কাছে আরও অর্থবহ লাগে। যে নির্দিষ্ট উদাহরণে।
থান্ডারগ্রি

1

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

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

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


সংকলক রানটাইমের সময় চিত্রের বাইরে। সেখানে রয়েছে যাতে CLR ব্যতিক্রম সব ব্যবস্থা করতে সক্ষম করে দেখুন / ধরা ব্লক জন্য একটি ওভারহেড হও। সি # .NET সিএলআর (একটি ভার্চুয়াল মেশিন) এ চলে। আমার কাছে মনে হয় যে ব্লকটির ওভারহেড নিজেই ন্যূনতম হয় যখন কোনও ব্যতিক্রম না থাকে তবে ব্যতিক্রমটি পরিচালনা করার সিএলআর ব্যয়টি অত্যন্ত তাৎপর্যপূর্ণ।
থান্ডারগ্রি

-4

আসুন চেষ্টা করার সময় ক্যাচ ব্লকের সবচেয়ে বড় সম্ভাব্য ব্যয়ের একটি বিশ্লেষণ করা যাক যেখানে এটির ব্যবহারের প্রয়োজন হবে না:

int x;
try {
    x = int.Parse("1234");
}
catch {
    return;
}
// some more code here...

এবং চেষ্টা / ধরা ছাড়াই এক এখানে:

int x;
if (int.TryParse("1234", out x) == false) {
    return;
}
// some more code here

তুচ্ছ সাদা-স্থান গণনা না করে, কেউ লক্ষ্য করতে পারেন যে এই দুটি সমকক্ষ কোডের টুকরা বাইটে প্রায় একই দৈর্ঘ্য। পরবর্তীটিতে 4 বাইট কম ইন্ডেন্টেশন থাকে। এটা কি খারাপ জিনিস?

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

while (int.TryParse(...))
{
    ...
}

কিন্তু চেষ্টা / ধরা ব্যবহার করার সময় এটি কীভাবে দেখায়?

try {
    for (;;)
    {
        x = int.Parse(...);
        ...
    }
}
catch
{
    ...
}

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

ছোট ব্যয়ের মধ্যে একটি হ'ল চেষ্টা / ধরার ব্লকগুলি কিছু নির্দিষ্ট অপ্টিমাইজেশন প্রকৃতপক্ষে অক্ষম করে: http://msmvps.com/blogs/peterritchie/archive/2007/06/22/performance- ছদ্মবেশ- of-try-catch- finally.aspx । আমার ধারণা এটিও একটি ইতিবাচক বিষয়। এটি অপ্টিমাইজেশানগুলি অক্ষম করতে ব্যবহার করা যেতে পারে যা অন্যথায় সুরক্ষিত পঙ্গু হতে পারে, বহুবিবাহিত অ্যাপ্লিকেশনগুলির জন্য বুদ্ধিমান বার্তা অ্যালগরিদমগুলি প্রেরণ করতে পারে, এবং সম্ভাব্য রেস শর্তগুলি ধরতে পারে;) আমি চেষ্টা / ধরা ব্যবহার করার কথা ভাবতে পারি scenario এমনকি যে বিকল্প আছে।


4
আমি নিশ্চিত যে ট্রাইপার্স চেষ্টা করে {int x = int.Parse ("xxx"); প্রত্যাবর্তন সত্য;} ধরা {প্রত্যাবর্তন মিথ্যা; } অভ্যন্তরীণভাবে। ইন্ডেন্টেশন প্রশ্নে উদ্বেগ নয়, কেবল কর্মক্ষমতা এবং ওভারহেড।
থান্ডারগ্রি

@ থান্ডারগ্রিয়ার বিকল্পভাবে, আমার পোস্ট করা নতুন উত্তরটি পড়ুন । এটিতে আরও লিঙ্ক রয়েছে, যার মধ্যে একটি হ'ল আপনি যখন Int.Parseপক্ষে যাওয়ার পক্ষে এড়াতে পারেন তখন ব্যাপক পারফরম্যান্স বৃদ্ধির বিশ্লেষণ Int.TryParse
অটিস্টিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.