সুতরাং, আমি জানি যে চেষ্টা / ধরা কিছু ওভারহেড যুক্ত করে এবং তাই প্রক্রিয়া প্রবাহ নিয়ন্ত্রণের একটি ভাল উপায় নয়, তবে এই ওভারহেডটি কোথা থেকে আসে এবং এটির প্রকৃত প্রভাব কী?
সুতরাং, আমি জানি যে চেষ্টা / ধরা কিছু ওভারহেড যুক্ত করে এবং তাই প্রক্রিয়া প্রবাহ নিয়ন্ত্রণের একটি ভাল উপায় নয়, তবে এই ওভারহেডটি কোথা থেকে আসে এবং এটির প্রকৃত প্রভাব কী?
উত্তর:
আমি ভাষা বাস্তবায়নে বিশেষজ্ঞ নই (তাই এটিকে লবণের দানা দিয়ে নিন) তবে আমি মনে করি যে সবচেয়ে বড় ব্যয় হ'ল স্ট্যাকটি খুলে ফেলা এবং স্ট্যাক ট্রেসের জন্য এটি সংরক্ষণ করা। আমার সন্দেহ হয় কেবলমাত্র ব্যতিক্রম ছুঁড়ে ফেলা হলে (তবে আমি জানি না), এবং যদি তাই হয় তবে প্রতিবার ব্যতিক্রম ছুঁড়ে ফেলার সময় এই শালীন আকারের গোপন ব্যয় করা হবে ... সুতরাং আপনি পছন্দ করেন না যে আপনি কেবল একটি জায়গা থেকে ঝাঁপিয়ে পড়ছেন অন্যটিতে কোডটিতে, অনেক কিছু চলছে।
আমি মনে করি না যতক্ষণ আপনি এক্সসিপলিট আচরণের জন্য ব্যতিক্রম ব্যবহার করছেন (তাই প্রোগ্রামের মাধ্যমে আপনার আদর্শ, প্রত্যাশিত পথ নয়) it's
এখানে তিনটি পয়েন্ট:
প্রথমত, আপনার কোডটিতে আসলে চেষ্টা-ব্লক থাকার ক্ষেত্রে খুব কম বা কোনও পারফরম্যান্স পেনাল্টি রয়েছে। আপনার অ্যাপ্লিকেশনটিতে সেগুলি এড়ানো চেষ্টা করার সময় এটি বিবেচনা করা উচিত নয়। পারফরম্যান্স হিট কেবল তখনই খেলতে আসে যখন কোনও ব্যতিক্রম ছুঁড়ে ফেলা হয়।
স্ট্যাক আনওয়ানডিং অপারেশন ইত্যাদি ছাড়াও যখন কোনও ব্যতিক্রম ছুঁড়ে দেওয়া হয় যা অন্যরা উল্লেখ করেছে আপনাকে অবশ্যই সচেতন হওয়া উচিত যে স্ট্যাক ট্রেসের মতো ব্যতিক্রম শ্রেণির সদস্যদের বসানোর জন্য রানটাইম / প্রতিচ্ছবি সম্পর্কিত সামগ্রীর পুরো গুচ্ছটি ঘটে থাকে বস্তু এবং বিভিন্ন ধরণের সদস্য ইত্যাদি
আমি বিশ্বাস করি যে এই কারণগুলির মধ্যে একটি সাধারণ কারণ আপনি যদি ব্যতিক্রমটি পুনর্বিবেচনা করতে যাচ্ছেন throw;
তবে ব্যতিক্রমটি আবার ফেলে দেওয়া বা একটি নতুন নির্মাণ করা যেমন সেই ক্ষেত্রে স্ট্যাকের সমস্ত তথ্যই আবার জমা দেওয়া হয়েছে তবে সাধারণ এটি সব সংরক্ষণ করা হয়।
throw new Exception("Wrapping layer’s error", ex);
আপনি কি চেষ্টা / ক্যাচ / ব্যবহারের ওভারহেড সম্পর্কে জিজ্ঞাসা করছেন অবশেষে যখন ব্যতিক্রম ছোঁড়া হয় না, বা প্রক্রিয়া প্রবাহকে নিয়ন্ত্রণ করতে ব্যতিক্রমগুলি ব্যবহার করার ওভারহেড? পরেরটি কোনও বাচ্চার জন্মদিনের মোমবাতি জ্বালানোর জন্য ডায়নামাইটের একটি কাঠি ব্যবহার করার মতো, এবং সম্পর্কিত ওভারহেড নিম্নলিখিত অঞ্চলে পড়ে:
আপনার অ্যাপ্লিকেশনটির কার্যকারী সেটে সাধারণত অনাবাসী কোড এবং ডেটা অ্যাক্সেস করা ছোঁড়া ব্যতিক্রমের কারণে আপনি অতিরিক্ত পৃষ্ঠা ত্রুটিগুলি আশা করতে পারেন।
উপরের দুটি আইটেমই সাধারণত "ঠান্ডা" কোড এবং ডেটা অ্যাক্সেস করে, তাই আপনার যদি মেমরির চাপ থাকে তবে হার্ড পৃষ্ঠার ফল্টগুলি সম্ভাব্য:
ব্যয়ের প্রকৃত প্রভাব হিসাবে, আপনার কোডটিতে সেই সময়ে কী চলছে তার উপর নির্ভর করে এটি অনেকটা পৃথক হতে পারে। জন স্কিটির এখানে কয়েকটি দরকারী সংযোগ সহ একটি ভাল সারসংক্ষেপ রয়েছে। আমি তার এই বক্তব্যের সাথে একমত হতে চাই যে আপনি যদি ব্যতিক্রমগুলি আপনার পারফরম্যান্সকে উল্লেখযোগ্যভাবে ক্ষতিগ্রস্থ করছেন এমন জায়গায় পৌঁছে যান, তবে কেবলমাত্র পারফরম্যান্সের বাইরে আপনার ব্যতিক্রমগুলির ব্যবহারের ক্ষেত্রে আপনার সমস্যা আছে।
আমার অভিজ্ঞতার মধ্যে সবচেয়ে বড় ওভারহেডটি আসলে একটি ব্যতিক্রম ছুঁড়ে ফেলা এবং এটি পরিচালনা করা। আমি একবার এমন একটি প্রকল্পে কাজ করেছি যেখানে নীচের মতো কোড ব্যবহার করা হয়েছিল যা পরীক্ষা করে দেখার জন্য কারও কারও কোনও জিনিস সম্পাদনা করার অধিকার ছিল কিনা। এই হ্যাশরাইট () পদ্ধতিটি উপস্থাপনা স্তরের সর্বত্র ব্যবহৃত হত এবং প্রায়শই 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();
}
সুতরাং সংক্ষেপে, স্বাভাবিক প্রক্রিয়া প্রবাহে ব্যতিক্রমগুলি ব্যবহারের ব্যতিক্রমীতা প্রায় দুই অর্ডার কম হয় তবে ব্যতিক্রম ছাড়াই অনুরূপ প্রক্রিয়া প্রবাহ ব্যবহার করা হয়।
সাধারণত গৃহীত তত্ত্বগুলির বিপরীতে try
/ / এর catch
উল্লেখযোগ্য পারফরম্যান্সের প্রভাব থাকতে পারে এবং এটি ব্যতিক্রম ছুঁড়ে দেওয়া হয় বা না!
প্রাক্তনটি কয়েক বছর ধরে মাইক্রোসফ্ট এমভিপিগুলি দ্বারা বেশ কয়েকটি ব্লগ পোস্টে আচ্ছাদিত ছিল এবং আমি বিশ্বাস করি যে আপনি এগুলি সহজেই খুঁজে পেতে পারেন স্ট্যাকওভারফ্লো সামগ্রীর বিষয়ে এত যত্ন করে তাই আমি তাদের কয়েকটিকে ফিলার প্রমাণ হিসাবে লিঙ্ক সরবরাহ করব :
try
catch
finally
পিটার রিচি দ্বারা / / ( এবং দ্বিতীয় ভাগ ) এর পারফরম্যান্সের প্রভাবগুলিtry
/catch
/finally
অক্ষমকরে এমন অপ্টিমাইজেশনগুলি অনুসন্ধান করে(এবং আমি স্ট্যান্ডার্ডের উদ্ধৃতিগুলি নিয়ে এর মধ্যে আরও আগে যাব)Parse
বনাম TryParse
বনামConvertTo
ইয়ান অভিমান দ্বারা blatantly যে "ব্যতিক্রম হ্যান্ডলিং খুব ধীর" এবং pitting দ্বারা এই বিন্দু প্রমানInt.Parse
এবংInt.TryParse
একে অপরের ... বিরুদ্ধে যারা জোরাজুরি করতে যেTryParse
ব্যবহারসমূহtry
/catch
লোকচক্ষুর অন্তরালে, এই কিছু হালকা চালা উচিত!এর রয়েছে এই উত্তরটি যা 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
এটি কোনও ঘন ঘন তথাকথিত পদ্ধতির ভিতরে থাকলে এটি প্রয়োগের সামগ্রিক আচরণকে প্রভাবিত করতে পারে তা উল্লেখ করার প্রয়োজন নেই।
উদাহরণস্বরূপ, আমি Int32. পার্সের ব্যবহারটিকে বেশিরভাগ ক্ষেত্রে একটি খারাপ অনুশীলন হিসাবে বিবেচনা করি কারণ এটি এমন কোনও কারণে ব্যতিক্রম ছোঁড়ে যা অন্যথায় সহজেই ধরা যায়।
সুতরাং এখানে লিখিত সমস্ত কিছুর উপসংহারে:
1) অপ্রত্যাশিত ত্রুটিগুলি ধরার জন্য চেষ্টা করুন .c
2) যদি আপনি এটি এড়াতে পারেন তবে ব্যতীত ত্রুটিযুক্ত ব্যতিক্রমগুলি ব্যবহার করবেন না।
আমি এই সম্পর্কে একটি নিবন্ধ লিখেছিলাম কিছুক্ষণ আগে কারণ এখানে অনেক লোক জিজ্ঞাসা করেছিল। আপনি এটি এবং পরীক্ষার কোডটি http://www.blackwasp.co.uk/SpeedTestTryCatch.aspx এ খুঁজে পেতে পারেন ।
আপশটটি হ'ল চেষ্টা / ধরার ব্লকটির জন্য অল্প পরিমাণে ওভারহেড রয়েছে তবে এটি এত কম যে এড়ানো উচিত। তবে, আপনি যদি লক্ষ লক্ষ বার মৃত্যুদন্ড কার্যকর করা লুপগুলিতে চেষ্টা / ধরার ব্লকগুলি চালাচ্ছেন তবে আপনি যদি সম্ভব হয় তবে ব্লকটিকে লুপের বাইরে নিয়ে যাওয়া বিবেচনা করতে পারেন।
চেষ্টা / ক্যাচ ব্লকগুলির মূল পারফরম্যান্স ইস্যুটি হ'ল আপনি যখন আসলে একটি ব্যতিক্রম ধরেন। এটি আপনার আবেদনে একটি লক্ষণীয় বিলম্ব যোগ করতে পারে। অবশ্যই, যখন জিনিসগুলি ভুল হচ্ছে, বেশিরভাগ বিকাশকারী (এবং প্রচুর ব্যবহারকারী) বিরতি ঘটতে চলেছে এমন ব্যতিক্রম হিসাবে স্বীকৃতি দেয়! এখানে কীটি স্বাভাবিক ক্রিয়াকলাপগুলির জন্য ব্যতিক্রম হ্যান্ডলিং ব্যবহার করা নয়। নামটি যেমন বোঝায়, এগুলি ব্যতিক্রমী এবং এগুলি নিক্ষেপ করা এড়াতে আপনার যথাসাধ্য চেষ্টা করা উচিত। আপনার সঠিকভাবে কাজ করা কোনও প্রোগ্রামের প্রত্যাশিত প্রবাহের অংশ হিসাবে এগুলি ব্যবহার করা উচিত নয়।
আমি গত বছর এই বিষয় সম্পর্কে একটি ব্লগ এন্ট্রি করেছি । এটা দেখ. নীচের লাইনটি হ'ল ট্রাই ব্লকের কোনও ব্যয় নেই যদি কোনও ব্যতিক্রম ঘটে না - এবং আমার ল্যাপটপে একটি ব্যতিক্রম প্রায় 36μs ছিল। এটি আপনার প্রত্যাশার চেয়ে কম হতে পারে, তবে মনে রাখবেন যে ফলাফলগুলি যেখানে অগভীর স্ট্যাক থাকে। এছাড়াও, প্রথম ব্যতিক্রমগুলি সত্যই ধীর।
try
/ catch
খুব বেশি ব্যবহার করছেন ? হি হি), তবে আপনি ভাষাগুলি এবং কিছু এমএস এমভিপি যারা এই বিষয়ে ব্লগ লিখেছেন, পরিমাপ সরবরাহ করে তাদের সাথে বিতর্ক করছেন বলে মনে হচ্ছে you আপনার পরামর্শের বিপরীতে ... আমি যে পরামর্শটি করেছি তা ভুল বলে আমি এই পরামর্শের জন্য উন্মুক্ত, তবে এটিতে কী বলছে তা দেখার জন্য আপনার ব্লগ এন্ট্রিটি পড়তে হবে।
try-catch
ব্লক বনাম tryparse()
পদ্ধতিগুলিকে লক্ষ্যবস্তু করে , তবে ধারণাটি একই।
সংকলক ত্রুটি বার্তা, কোড বিশ্লেষণ সতর্কতা বার্তা এবং রুটিন স্বীকৃত ব্যতিক্রম (বিশেষত ব্যতিক্রম যা এক জায়গায় ফেলে দেওয়া হয় এবং অন্য কোনও জায়গায় গৃহীত হয়) মুক্ত, কোড লেখা, ডিবাগ করা এবং বজায় রাখা অত্যন্ত সহজ। যেহেতু এটি সহজ, কোডটি আরও ভাল ভাল লিখিত এবং কম বগী হবে।
আমার কাছে, সেই প্রোগ্রামার এবং গুণমানের ওভারহেড প্রক্রিয়া প্রবাহের জন্য ট্র্যাচ-ক্যাচ ব্যবহার করার বিরুদ্ধে প্রাথমিক যুক্তি।
ব্যতিক্রমগুলির কম্পিউটারের ওভারহেড তুলনা তুলনায় তুচ্ছ এবং সাধারণত অ্যাপ্লিকেশনটির বাস্তব-বিশ্বের পারফরম্যান্সের প্রয়োজনীয়তাগুলি পূরণ করার দক্ষতার ক্ষেত্রে খুব ছোট।
আমি সত্যিই হাফথরের ব্লগ পোস্টটি পছন্দ করি এবং এই আলোচনায় আমার দুটি সেন্ট যুক্ত করতে আমি বলতে চাই যে, ডেটা লেয়ার কেবলমাত্র এক ধরণের ব্যতিক্রম (ডাটাঅ্যাক্সেসএক্সসেপশন) ফেলে রাখা আমার পক্ষে সবসময় সহজ ছিল। এইভাবে আমার ব্যবসায় লেয়ারটি কী ব্যতিক্রম প্রত্যাশা করবে এবং এটি ধরবে তা জানে। তারপরে আরও ব্যবসায়ের নিয়মের উপর নির্ভর করে (যেমন যদি আমার ব্যবসায়ের অবজেক্ট ওয়ার্কফ্লো ইত্যাদিতে অংশ নেয়) তবে আমি নতুন ব্যতিক্রম (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;
}
মাইকেল এল স্কট দ্বারা প্রোগ্রামিং ল্যাঙ্গুয়েজস প্রেগমেটিক্সে আমরা পড়তে পারি যে আজকাল সংকলকরা সাধারণ ক্ষেত্রে কোনও ওভারহেড যোগ করে না, এর অর্থ, যখন কোনও ব্যতিক্রম ঘটে না। সুতরাং প্রতিটি কাজ সংকলন সময়ে তৈরি হয়। কিন্তু যখন কোনও ব্যতিক্রম রান-টাইমে নিক্ষেপ করা হয় তখন সংকলককে সঠিক ব্যতিক্রম সন্ধানের জন্য একটি বাইনারি অনুসন্ধান করা দরকার এবং এটি আপনার করা প্রতিটি নতুন থ্রোয়ের জন্য ঘটবে।
তবে ব্যতিক্রম ব্যতিক্রম এবং এই ব্যয়টি পুরোপুরি গ্রহণযোগ্য। আপনি যদি ব্যতিক্রম ছাড়াই ব্যতিক্রম হ্যান্ডলিং করার চেষ্টা করেন এবং পরিবর্তে ত্রুটি কোডগুলি ব্যবহার করেন, সম্ভবত আপনার প্রতিটি সাব্রোটিনের জন্য যদি একটি বিবৃতি প্রয়োজন হয় এবং এটি সত্যিকারের রিয়েল টাইম ওভারহেডে ব্যয় করে। আপনি যদি জানেন যে বিবৃতিটি কয়েকটি সমাবেশ নির্দেশিকায় রূপান্তরিত হয়, যা প্রতিবার আপনার সাব-রুটিনগুলিতে প্রবেশ করার সময় সঞ্চালিত হবে।
আমার ইংরেজি সম্পর্কে দুঃখিত, আশা করি এটি আপনাকে সহায়তা করবে। এই তথ্যটি উদ্ধৃত গ্রন্থের ভিত্তিতে তৈরি করা হয়েছে, আরও তথ্যের জন্য অধ্যায় 8.5 ব্যতিক্রম হ্যান্ডলিং পড়ুন।
আসুন চেষ্টা করার সময় ক্যাচ ব্লকের সবচেয়ে বড় সম্ভাব্য ব্যয়ের একটি বিশ্লেষণ করা যাক যেখানে এটির ব্যবহারের প্রয়োজন হবে না:
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 এমনকি যে বিকল্প আছে।
Int.Parse
পক্ষে যাওয়ার পক্ষে এড়াতে পারেন তখন ব্যাপক পারফরম্যান্স বৃদ্ধির বিশ্লেষণ Int.TryParse
।