সবশেষে ব্লকগুলির ভিতরে যা আছে তা সর্বদা কার্যকর করা হয় (প্রায়) সর্বদা, সুতরাং এটিতে কোডটি বন্ধ করে দেওয়া বা এটি বন্ধ না করার মধ্যে পার্থক্য কী?
সবশেষে ব্লকগুলির ভিতরে যা আছে তা সর্বদা কার্যকর করা হয় (প্রায়) সর্বদা, সুতরাং এটিতে কোডটি বন্ধ করে দেওয়া বা এটি বন্ধ না করার মধ্যে পার্থক্য কী?
উত্তর:
শেষ পর্যন্ত ব্লকের কোডটি ব্যতিক্রম হবে কিনা তা নির্বিশেষে কার্যকর করা হবে। এটি খুব কার্যকর হয়ে আসে যখন নির্দিষ্ট ঘরের রক্ষণাবেক্ষণের ফাংশনগুলির ক্ষেত্রে আপনার সর্বদা বন্ধ সংযোগের মতো চালানো দরকার।
এখন, আমি আপনার প্রশ্নটি অনুমান করছি যে কেন আপনার এটি করা উচিত:
try
{
doSomething();
}
catch
{
catchSomething();
}
finally
{
alwaysDoThis();
}
আপনি যখন এটি করতে পারেন:
try
{
doSomething();
}
catch
{
catchSomething();
}
alwaysDoThis();
উত্তরটি হ'ল আপনার ক্যাচ স্টেটমেন্টের অভ্যন্তরে প্রচুর কোড হয় একটি ব্যতিক্রম পুনর্বিবেচনা করবে বা বর্তমান ফাংশনটি ভেঙে দেবে। পরবর্তী কোড সহ, "সর্বদা এই কর ();" যদি ক্যাচ স্টেটমেন্টের কোডটি কোনও রিটার্ন জারি করে বা একটি নতুন ব্যতিক্রম ছুঁড়ে তবে কল কার্যকর করা হবে না।
চেষ্টা শেষ অবধি ব্যবহারের বেশিরভাগ সুবিধাগুলি ইতিমধ্যে ইঙ্গিত করা হয়েছে, তবে আমি ভেবেছিলাম আমি এটি যুক্ত করব:
try
{
// Code here that might throw an exception...
if (arbitraryCondition)
{
return true;
}
// Code here that might throw an exception...
}
finally
{
// Code here gets executed regardless of whether "return true;" was called within the try block (i.e. regardless of the value of arbitraryCondition).
}
এই আচরণটি বিভিন্ন পরিস্থিতিতে এটি খুব দরকারী করে তোলে, বিশেষত যখন আপনার ক্লিনআপ (সংস্থানগুলি নিষ্পত্তি) করা প্রয়োজন, যদিও ব্যবহারের ব্লকটি এই ক্ষেত্রে প্রায়শই ভাল better
যে কোনও সময় আপনি স্ট্রিম রিডার, ডিবি অনুরোধ ইত্যাদির মতো নিয়ন্ত্রণহীন কোড অনুরোধগুলি ব্যবহার করেন; এবং আপনি ব্যতিক্রমটি ধরতে চান তবে শেষ পর্যন্ত ক্যাপচার চেষ্টা করুন এবং শেষ পর্যন্ত স্ট্রিম, ডেটা রিডার ইত্যাদি বন্ধ করুন, যদি আপনি ভুল করে না থাকেন তবে সংযোগটি বন্ধ না হয়ে থাকে, ডিবি অনুরোধের সাথে এটি সত্যিই খারাপ is
SqlConnection myConn = new SqlConnection("Connectionstring");
try
{
myConn.Open();
//make na DB Request
}
catch (Exception DBException)
{
//do somehting with exception
}
finally
{
myConn.Close();
myConn.Dispose();
}
আপনি যদি ত্রুটিটি ধরতে না চান তবে ব্যবহার করুন
using (SqlConnection myConn = new SqlConnection("Connectionstring"))
{
myConn.Open();
//make na DB Request
myConn.Close();
}
এবং কোনও ত্রুটি থাকলে সংযোগ অবজেক্টটি স্বয়ংক্রিয়ভাবে নিষ্পত্তি হবে তবে আপনি ত্রুটিটি ক্যাপচার করেন না
কারণ অবশেষে মৃত্যুদন্ড কার্যকর করা হবে এমনকি যদি আপনি কোনও ক্যাচ ব্লকে ব্যতিক্রম না পরিচালনা করেন।
পরিশেষে বিবৃতিগুলি রিটার্নের পরেও কার্যকর করতে পারে।
private int myfun()
{
int a = 100; //any number
int b = 0;
try
{
a = (5 / b);
return a;
}
catch (Exception ex)
{
Response.Write(ex.Message);
return a;
}
// Response.Write("Statement after return before finally"); -->this will give error "Syntax error, 'try' expected"
finally
{
Response.Write("Statement after return in finally"); // --> This will execute , even after having return code above
}
Response.Write("Statement after return after finally"); // -->Unreachable code
}
finally
যেমনটি রয়েছে:
try {
// do something risky
} catch (Exception ex) {
// handle an exception
} finally {
// do any required cleanup
}
try..catch
আপনার চেষ্টা ব্লক একটি ব্যতিক্রম ছুঁড়ে দিয়েছে কিনা তা বিবেচনা না করেই আপনার ব্লকের পরে কোড কার্যকর করার একটি গ্যারান্টিযুক্ত সুযোগ ।
এটি রিসোর্স রিলিজ, ডিবি সংযোগ, ফাইল হ্যান্ডেল ইত্যাদির জন্য উপযুক্ত করে তোলে perfect
আমি ফাইল রিডার ব্যতিক্রম উদাহরণ সহ শেষ পর্যন্ত এর ব্যবহার ব্যাখ্যা করব
try{ StreamReader strReader = new StreamReader(@"C:\Ariven\Project\Data.txt"); Console.WriteLine(strReader.ReadeToEnd()); StreamReader.Close(); } catch (Exception ex) { Console.WriteLine(ex.Message); }
উপরের উদাহরণে যদি ডেটা.এসটিএসটি নামের ফাইলটি অনুপস্থিত থাকে তবে একটি ব্যতিক্রম ছুঁড়ে দেওয়া হবে এবং পরিচালনা করা হবে তবে ডাকা স্টেটমেন্টটি কখনই কার্যকর হবে না। কারণ পাঠকদের সাথে যুক্ত এই সংস্থানগুলি কখনই প্রকাশিত হয়নি।StreamReader.Close();
StreamReader strReader = null; try{ strReader = new StreamReader(@"C:\Ariven\Project\Data.txt"); Console.WriteLine(strReader.ReadeToEnd()); } catch (Exception ex){ Console.WriteLine(ex.Message); } finally{ if (strReader != null){ StreamReader.Close(); } }
শুভ কোডিং :)
দ্রষ্টব্য: "@" একটি ভারব্যাটিম স্ট্রিং তৈরি করতে ব্যবহৃত হয় , "অজ্ঞাতসারে অব্যাহতি ক্রম" এর ত্রুটি এড়ানোর জন্য। @ প্রতীকটির অর্থ সেই স্ট্রিংটি আক্ষরিকভাবে পড়া এবং অন্যথায় নিয়ন্ত্রণের অক্ষরগুলি ব্যাখ্যা করবেন না।
বলুন আপনাকে অপেক্ষার (ঘন্টাঘড়ি) কার্সারের পরিবর্তে কার্সারটি ডিফল্ট পয়েন্টারে ফিরে যেতে হবে। যদি কার্সার সেট করার আগে কোনও ব্যতিক্রম ছুঁড়ে ফেলা হয় এবং অ্যাপটি সরাসরি ক্র্যাশ না করে তবে আপনি একটি বিভ্রান্তিকর কার্সার রেখে যেতে পারেন।
কখনও কখনও আপনি একটি ব্যতিক্রম হ্যান্ডেল করতে চান না (কোনও ক্যাচ ব্লক নেই), তবে আপনি কিছু ক্লিনআপ কোড কার্যকর করতে চান।
উদাহরণ স্বরূপ:
try
{
// exception (or not)
}
finally
{
// clean up always
}
অবশেষে ব্লকটি চেষ্টা ব্লকে বরাদ্দকৃত কোনও সংস্থান পরিষ্কার করার পাশাপাশি কোনও ব্যতিক্রম থাকলেও কার্যকর করতে হবে এমন কোনও কোড চালানোর জন্য মূল্যবান। কীভাবে চেষ্টা ব্লকটি প্রস্থান করে তা নির্বিশেষে নিয়ন্ত্রণ সর্বদা অবশেষে ব্লককে দেওয়া হয়।
আহ্ ... আমার মনে হয় আপনি যা বলছেন তা আমি দেখছি! আমাকে এক সেকেন্ড নিয়ে গিয়েছিল ... আপনি ভাবছেন "কেন এটিকে অবশেষে ব্লকের পরিবর্তে এবং চেষ্টা-শেষের দিকে সম্পূর্ণরূপে বাইরে রাখার পরিবর্তে অবশেষে ব্লকে রাখুন"।
উদাহরণস্বরূপ, এটি হতে পারে কারণ আপনি কোনও ত্রুটি ছুঁড়ে ফেললে আপনি মৃত্যুদন্ড কার্যকর করছেন, তবে আপনি এখনও ফাইলগুলি, ডাটাবেস সংযোগগুলি, যেমন ওপেন ফাইলগুলি পরিষ্কার করতে চান want
নথিতে উল্লিখিত হিসাবে :
ক্যাপের সাধারণ ব্যবহার এবং অবশেষে একত্রে চেষ্টা ব্লকে রিসোর্সগুলি অর্জন এবং ব্যবহার করা, একটি ক্যাচ ব্লকে ব্যতিক্রমী পরিস্থিতিতে মোকাবিলা করা এবং শেষ অবধি রিসোর্সগুলি প্রকাশ করা।
এছাড়া পড়া মূল্য এই , যেটি বলে:
একবার ম্যাচের ক্যাচ ক্লোজটি পাওয়া গেলে, সিস্টেমটি ক্যাচ ক্লজের প্রথম বিবৃতিতে নিয়ন্ত্রণ স্থানান্তর করতে প্রস্তুত করে। ক্যাচ ক্লজটি কার্যকর করার আগে, সিস্টেমটি প্রথমে কার্যকর করে, যাতে প্রথমে চেষ্টা করা বক্তব্যগুলির সাথে যুক্ত যে কোনও ধারা বাদ পড়েছিল, তার ব্যতিক্রমটি ধরা পড়ে তার চেয়ে বেশি।
সুতরাং এটি স্পষ্ট যে কোনও ধারাটিতে থাকা কোডটি finally
কার্যকর করা হবে এমনকি পূর্বের catch
ধারাটিতে একটি return
বিবৃতি থাকলেও ।