try {
// Do stuff
}
catch (Exception e) {
throw;
}
finally {
// Clean up
}
উপরের ব্লকে শেষ অবধি কবে বলা হয়? ই ছুঁড়ে ফেলার আগে বা শেষ পর্যন্ত বলা হয় এবং তারপর ধরা হয়?
try {
// Do stuff
}
catch (Exception e) {
throw;
}
finally {
// Clean up
}
উপরের ব্লকে শেষ অবধি কবে বলা হয়? ই ছুঁড়ে ফেলার আগে বা শেষ পর্যন্ত বলা হয় এবং তারপর ধরা হয়?
উত্তর:
পুনরায় নিক্ষেপ করার পরে এটি ডাকা হবে (অর্থাত ব্লক কার্যকর করার পরে)
7 বছর পরে এটি সম্পাদনা - একটি গুরুত্বপূর্ণ দ্রষ্টব্য হ'ল যদি eকল স্ট্যাকের উপরে যদি চেষ্টা / ক্যাচ ব্লক ধরে না যায় বা কোনও বিশ্বব্যাপী ব্যতিক্রম হ্যান্ডলার দ্বারা পরিচালিত না হয় তবে finallyব্লকটি কখনই কার্যকর হতে পারে না।
finallyপূর্ববর্তীটিতে ফেলে দেওয়া ব্যতিক্রমটি catchকখনই বাইরের - ব্লকে ধরা না পড়লে তা কার্যকর করা হয় না ! trycatch
কেন চেষ্টা করবেন না:
outer try
inner try
inner catch
inner finally
outer catch
outer finally
কোড সহ (উল্লম্ব স্থানের জন্য ফর্ম্যাট করা):
static void Main() {
try {
Console.WriteLine("outer try");
DoIt();
} catch {
Console.WriteLine("outer catch");
// swallow
} finally {
Console.WriteLine("outer finally");
}
}
static void DoIt() {
try {
Console.WriteLine("inner try");
int i = 0;
Console.WriteLine(12 / i); // oops
} catch (Exception e) {
Console.WriteLine("inner catch");
throw e; // or "throw", or "throw anything"
} finally {
Console.WriteLine("inner finally");
}
}
outer try inner try inner catch Unhandled Exception: System.DivideByZeroException...
এখানে সমস্ত উত্তর পড়ার পরে মনে হচ্ছে চূড়ান্ত উত্তরটি এটি নির্ভর করে :
আপনি যদি ক্যাচ ব্লকের মধ্যে কোনও ব্যতিক্রম পুনরায় নিক্ষেপ করেন এবং সেই ব্যতিক্রমটি অন্য ক্যাচ ব্লকের ভিতরে ধরা পড়ে, ডকুমেন্টেশন অনুসারে সবকিছু কার্যকর হয়।
যাইহোক, যদি পুনরায় ট্রাউন ব্যতিক্রমটি নিয়ন্ত্রণহীন হয়, শেষ পর্যন্ত কখনই কার্যকর করে না।
আমি ভিএস2010 ডাব্লু / সি # 4.0 এ এই কোড নমুনাটি পরীক্ষা করেছি
static void Main()
{
Console.WriteLine("Example 1: re-throw inside of another try block:");
try
{
Console.WriteLine("--outer try");
try
{
Console.WriteLine("----inner try");
throw new Exception();
}
catch
{
Console.WriteLine("----inner catch");
throw;
}
finally
{
Console.WriteLine("----inner finally");
}
}
catch
{
Console.WriteLine("--outer catch");
// swallow
}
finally
{
Console.WriteLine("--outer finally");
}
Console.WriteLine("Huzzah!");
Console.WriteLine();
Console.WriteLine("Example 2: re-throw outside of another try block:");
try
{
Console.WriteLine("--try");
throw new Exception();
}
catch
{
Console.WriteLine("--catch");
throw;
}
finally
{
Console.WriteLine("--finally");
}
Console.ReadLine();
}
এখানে ফলাফল:
উদাহরণ 1: আরেকটি চেষ্টা ব্লকের ভিতরে পুনরায় নিক্ষেপ করুন: -
আউটর চেষ্টা
---- অভ্যন্তরীণ চেষ্টা
---- অভ্যন্তরীণ ক্যাচ
---- অভ্যন্তরীণ -
আউটার ক্যাচ -
আউট অব হুজাহ
!উদাহরণ 2: আরেকটি চেষ্টা ব্লকের বাইরে পুনরায় নিক্ষেপ করুন:
--ট্রি -
ক্যাচআনহ্যান্ডলড ব্যতিক্রম: সিস্টেম. এক্সেপশন: 'সিস্টেম. এক্সপ্লেশন' টাইপের ব্যতিক্রম ছুঁড়ে দেওয়া হয়েছিল।
কনসোল অ্যাপ্লিকেশন ১. প্রোগ্রামে.মেন () সি তে: \ স্থানীয় উত্স so কনসোল অ্যাপ্লিকেশন 1 \ প্রোগ্রাম.cs: লাইন 53
আপনার উদাহরণটি এই কোডটির সাথে অভিন্ন আচরণ করবে:
try {
try {
// Do stuff
} catch(Exception e) {
throw e;
}
} finally {
// Clean up
}
পার্শ্ব নোট হিসাবে, যদি আপনি সত্যিই বোঝাতে চান throw e;(এটি হ'ল একই ব্যতিক্রমটিকে আপনি ফেলেছিলেন) তবে এটি করা আরও ভাল throw;কারণ এটি একটি নতুন তৈরি করার পরিবর্তে মূল স্ট্যাক ট্রেসকে সংরক্ষণ করবে।
finallyব্লক আসলে পর চালানো হবে catchব্লক (এমনকি যদি ধরা ব্লক ব্যতিক্রম rethrows), যা কি আমার স্নিপেট চিত্রিত করার চেষ্টা করছে।
tryউত্তরটির ভিতরে আমার উত্তরে একটি "চেষ্টা-ধরা" রয়েছে। আমি দুটি 2-পার্ট কনস্ট্রাক্ট ব্যবহার করে 3-পার্ট কনস্ট্রাক্টের আচরণটি ব্যাখ্যা করার চেষ্টা করছি। আমি tryআসল প্রশ্নে দ্বিতীয় ব্লকের কোনও চিহ্ন দেখতে পাচ্ছি না , সুতরাং আপনি কোথায় পাচ্ছেন তা বুঝতে পারছি না।
যদি ক্যাচ হ্যান্ডলার ব্লকের ভিতরে কোনও অপরিবর্তিত ব্যতিক্রম থাকে তবে শেষ অবধি ঠিক শূন্য বার বলা হয়ে থাকে
static void Main(string[] args)
{
try
{
Console.WriteLine("in the try");
int d = 0;
int k = 0 / d;
}
catch (Exception e)
{
Console.WriteLine("in the catch");
throw;
}
finally
{
Console.WriteLine("In the finally");
}
}
আউটপুট:
সি: \ ব্যবহারকারী \ প্রশাসক \ নথি \ TestExceptionNesting \ বিন \ রিলিজ> TestExceptionNesting.exe
চেষ্টা করে
ধরতে
আনহ্যান্ডলড ব্যতিক্রম: সিস্টেম.ডাইভাইডবিজিরো এক্সেপশন: শূন্য দ্বারা ভাগ করার চেষ্টা করা হয়েছে। টেস্টএক্সেপশন নেস্টিং.পাগ্রাম.মেন (স্ট্রিং [] আরগস) এ সি: \ ব্যবহারকারী \ প্রশাসক \ নথি \ টেস্টএক্সেপশন নেস্টিং \ টেস্টএক্সেপশন নেস্টিং.সি: লাইন 22
সি: \ ব্যবহারকারী \ প্রশাসক \ নথি \ TestExceptionNesting \ বিন \ মুক্তি>
আমি আজ একটি সাক্ষাত্কারে এই প্রশ্নটি জিজ্ঞাসা করেছি এবং সাক্ষাত্কারকারীর ফিরে যেতে থাকল "আপনি কি শেষ অবধি ডাকেন না নিশ্চিত?" আমি অনিশ্চিত ছিলাম যদি এটি কোনও কৌতুকপূর্ণ প্রশ্ন ছিল বা সাক্ষাত্কারকারীর মনে অন্য কিছু ছিল এবং আমার ডিবাগ করার জন্য ভুল কোড লিখেছিল তাই আমি বাড়িতে এসে চেষ্টা করেছিলাম (বিল্ড এবং রান করুন, কোনও ডিবাগার ইন্টারঅ্যাকশন নয়), কেবল আমার মনকে লক্ষ্য রাখার জন্য বিশ্রাম.
একটি সি # কনসোল অ্যাপ্লিকেশন দিয়ে পরীক্ষা করা, অবশেষে কোডটি ব্যতিক্রম ছড়িয়ে দেওয়ার পরে কার্যকর করা হয়েছে: "অ্যাপ্লিকেশন ত্রুটি ডায়ালগ" বিদ্যমান ছিল এবং আপনি "প্রোগ্রামটি বন্ধ করুন" বিকল্পটি বেছে নেওয়ার পরে, শেষ অবধি সেই কনসোল উইন্ডোটিতে কার্যকর করা হয়েছিল। তবে শেষ অবধি কোড ব্লকের ভিতরে ব্রেকিং পয়েন্ট স্থাপন করে আমি কখনই এটি আঘাত করতে পারি না। ডিবাগারটি থ্রো স্টেটমেন্টে থামতে থাকে। আমার পরীক্ষার কোডটি এখানে:
class Program
{
static void Main(string[] args)
{
string msg;
Console.WriteLine(string.Format("GetRandomNuber returned: {0}{1}", GetRandomNumber(out msg), msg) == "" ? "" : "An error has occurred: " + msg);
}
static int GetRandomNumber(out string errorMessage)
{
int result = 0;
try
{
errorMessage = "";
int test = 0;
result = 3/test;
return result;
}
catch (Exception ex)
{
errorMessage = ex.Message;
throw ex;
}
finally
{
Console.WriteLine("finally block!");
}
}
}
ভিএস2010 -। নেট ফ্রেমওয়ার্ক 4.0 এ ডিবাগিং