সি # তে অবশেষে কেন ব্যবহার করবেন?


188

সবশেষে ব্লকগুলির ভিতরে যা আছে তা সর্বদা কার্যকর করা হয় (প্রায়) সর্বদা, সুতরাং এটিতে কোডটি বন্ধ করে দেওয়া বা এটি বন্ধ না করার মধ্যে পার্থক্য কী?


3
এটিকে আবদ্ধ না রেখে কী বোঝাতে চাইছেন?
রমেশ

5
এবং "(প্রায়)" বলতে কী বোঝ?
বেসকা

49
আপনি যদি কোনও যন্ত্র একটি চেষ্টা ক্লজ কার্যকর করার সময় পাওয়ার কর্ডটি বাইরে টানেন তবে শেষ অবধি কল করা হবে না।
Dour উচ্চ আর্চ

5
হ্যাঁ, হ্যাঁ, এটি সত্য, তবে আপনি কি এটির জন্য সত্যই কোড করতে পারবেন না?
এড এস

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

উত্তর:


404

শেষ পর্যন্ত ব্লকের কোডটি ব্যতিক্রম হবে কিনা তা নির্বিশেষে কার্যকর করা হবে। এটি খুব কার্যকর হয়ে আসে যখন নির্দিষ্ট ঘরের রক্ষণাবেক্ষণের ফাংশনগুলির ক্ষেত্রে আপনার সর্বদা বন্ধ সংযোগের মতো চালানো দরকার।

এখন, আমি আপনার প্রশ্নটি অনুমান করছি যে কেন আপনার এটি করা উচিত:

try
{
    doSomething();
}
catch
{
    catchSomething();
}
finally
{
    alwaysDoThis();
}

আপনি যখন এটি করতে পারেন:

try
{
    doSomething();
}
catch
{
    catchSomething();
}

alwaysDoThis();

উত্তরটি হ'ল আপনার ক্যাচ স্টেটমেন্টের অভ্যন্তরে প্রচুর কোড হয় একটি ব্যতিক্রম পুনর্বিবেচনা করবে বা বর্তমান ফাংশনটি ভেঙে দেবে। পরবর্তী কোড সহ, "সর্বদা এই কর ();" যদি ক্যাচ স্টেটমেন্টের কোডটি কোনও রিটার্ন জারি করে বা একটি নতুন ব্যতিক্রম ছুঁড়ে তবে কল কার্যকর করা হবে না।


3
হুম। আমি যা বলেছিলাম তার সাথে খুব মিল, তবে আরও পরিষ্কার এবং আরও নির্ভুল। নির্ধারিত +1।
বেসকা

45
এটি চেষ্টা}} ব্লকের ভিতরেও "ফিরে" প্রযোজ্য।
লুকাস

4
প্রকৃতপক্ষে, এটি ক্যাচ without} ব্লক ছাড়াই প্রযোজ্য (কেবলমাত্র চেষ্টা / শেষ অবধি ব্যতিক্রমগুলি বুবলি করা)
লুকাস

আমার চেয়ে ভাল, কাজ করা ছিল এবং বিশদটি দিয়ে উত্তর দেওয়ার জন্য দশ মিনিট ব্যয় করতে চান নি। +1
ম্যাট ব্রিগস

2
হ্যাঁ, আমি যা মনে রেখেছিলাম ঠিক এটি ছিল: ডি এখন আমি এটি বুঝতে পারি।
রডরিগো

62

চেষ্টা শেষ অবধি ব্যবহারের বেশিরভাগ সুবিধাগুলি ইতিমধ্যে ইঙ্গিত করা হয়েছে, তবে আমি ভেবেছিলাম আমি এটি যুক্ত করব:

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


2
শেষ পর্যন্ত আমি আক্ষরিকভাবেই এটি ব্যবহার করি
ক্রিস্টোফার টাউনসেন্ড

12

যে কোনও সময় আপনি স্ট্রিম রিডার, ডিবি অনুরোধ ইত্যাদির মতো নিয়ন্ত্রণহীন কোড অনুরোধগুলি ব্যবহার করেন; এবং আপনি ব্যতিক্রমটি ধরতে চান তবে শেষ পর্যন্ত ক্যাপচার চেষ্টা করুন এবং শেষ পর্যন্ত স্ট্রিম, ডেটা রিডার ইত্যাদি বন্ধ করুন, যদি আপনি ভুল করে না থাকেন তবে সংযোগটি বন্ধ না হয়ে থাকে, ডিবি অনুরোধের সাথে এটি সত্যিই খারাপ 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();
        }

এবং কোনও ত্রুটি থাকলে সংযোগ অবজেক্টটি স্বয়ংক্রিয়ভাবে নিষ্পত্তি হবে তবে আপনি ত্রুটিটি ক্যাপচার করেন না


2
নিষ্পত্তি () এছাড়াও সংযোগ বন্ধ করবে (), উভয় কল করার প্রয়োজন নেই। বন্ধ () ডিপোস () না করে, আপনি সংযোগটি আবার খুলতে পারেন।
লুকাস

চমৎকার, ব্যবহার করার জন্য ধন্যবাদ। আমি উত্তর দিতে হবে, অন্যথায়।
ড্যান রোজনস্টার্ক

11

কারণ অবশেষে মৃত্যুদন্ড কার্যকর করা হবে এমনকি যদি আপনি কোনও ক্যাচ ব্লকে ব্যতিক্রম না পরিচালনা করেন।


7

পরিশেষে বিবৃতিগুলি রিটার্নের পরেও কার্যকর করতে পারে।

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
}

7

finallyযেমনটি রয়েছে:

try {
  // do something risky
} catch (Exception ex) {
  // handle an exception
} finally {
  // do any required cleanup
}

try..catchআপনার চেষ্টা ব্লক একটি ব্যতিক্রম ছুঁড়ে দিয়েছে কিনা তা বিবেচনা না করেই আপনার ব্লকের পরে কোড কার্যকর করার একটি গ্যারান্টিযুক্ত সুযোগ ।

এটি রিসোর্স রিলিজ, ডিবি সংযোগ, ফাইল হ্যান্ডেল ইত্যাদির জন্য উপযুক্ত করে তোলে perfect


3
এই সমস্ত উদাহরণগুলি সাধারণত একটি ব্যবহার ব্লকের সাথে আরও ভাল পরিবেশন করা হয়, তবে এটি আপনার উত্তর থেকে সত্যই হ্রাস পায় না।
জোয়েল কোহোর্ন

4

আমি ফাইল রিডার ব্যতিক্রম উদাহরণ সহ শেষ পর্যন্ত এর ব্যবহার ব্যাখ্যা করব

  • শেষ পর্যন্ত ব্যবহার করে
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();
    }
}

শুভ কোডিং :)

দ্রষ্টব্য: "@" একটি ভারব্যাটিম স্ট্রিং তৈরি করতে ব্যবহৃত হয় , "অজ্ঞাতসারে অব্যাহতি ক্রম" এর ত্রুটি এড়ানোর জন্য। @ প্রতীকটির অর্থ সেই স্ট্রিংটি আক্ষরিকভাবে পড়া এবং অন্যথায় নিয়ন্ত্রণের অক্ষরগুলি ব্যাখ্যা করবেন না।


2

বলুন আপনাকে অপেক্ষার (ঘন্টাঘড়ি) কার্সারের পরিবর্তে কার্সারটি ডিফল্ট পয়েন্টারে ফিরে যেতে হবে। যদি কার্সার সেট করার আগে কোনও ব্যতিক্রম ছুঁড়ে ফেলা হয় এবং অ্যাপটি সরাসরি ক্র্যাশ না করে তবে আপনি একটি বিভ্রান্তিকর কার্সার রেখে যেতে পারেন।


2

কখনও কখনও আপনি একটি ব্যতিক্রম হ্যান্ডেল করতে চান না (কোনও ক্যাচ ব্লক নেই), তবে আপনি কিছু ক্লিনআপ কোড কার্যকর করতে চান।

উদাহরণ স্বরূপ:

try
{
    // exception (or not)
}
finally
{
    // clean up always
}

ব্যতিক্রম ধরা না পড়লে, অপারেটিং সিস্টেমটি একটি ব্যতিক্রম অপ্রচলিত ক্রিয়াকলাপটি ট্রিগার করতে বেছে নেয় কিনা তার উপর নির্ভর করে অবশেষে ব্লকের সম্পাদন নির্ভর করে।
বিকাশ ভার্মা

2

অবশেষে ব্লকটি চেষ্টা ব্লকে বরাদ্দকৃত কোনও সংস্থান পরিষ্কার করার পাশাপাশি কোনও ব্যতিক্রম থাকলেও কার্যকর করতে হবে এমন কোনও কোড চালানোর জন্য মূল্যবান। কীভাবে চেষ্টা ব্লকটি প্রস্থান করে তা নির্বিশেষে নিয়ন্ত্রণ সর্বদা অবশেষে ব্লককে দেওয়া হয়।


1

আহ্ ... আমার মনে হয় আপনি যা বলছেন তা আমি দেখছি! আমাকে এক সেকেন্ড নিয়ে গিয়েছিল ... আপনি ভাবছেন "কেন এটিকে অবশেষে ব্লকের পরিবর্তে এবং চেষ্টা-শেষের দিকে সম্পূর্ণরূপে বাইরে রাখার পরিবর্তে অবশেষে ব্লকে রাখুন"।

উদাহরণস্বরূপ, এটি হতে পারে কারণ আপনি কোনও ত্রুটি ছুঁড়ে ফেললে আপনি মৃত্যুদন্ড কার্যকর করছেন, তবে আপনি এখনও ফাইলগুলি, ডাটাবেস সংযোগগুলি, যেমন ওপেন ফাইলগুলি পরিষ্কার করতে চান want


1

শেষ অবধি কন্ট্রোল ফ্লো হয় ট্রাই বা ক্যাচ ব্লকের পরে।

[1. First Code]
[2. Try]
[3. Catch]
[4. Finally]
[5. After Code]

1> 2> 3> 4> 5 ব্যতীত যদি 3 এর রিটার্নের বিবৃতি থাকে 1> 2> 3> 4

1> 2> 4> 5 ব্যতীত যদি 2 এর রিটার্নের স্টেটমেন্ট থাকে> 1> 2> 4


0

নথিতে উল্লিখিত হিসাবে :

ক্যাপের সাধারণ ব্যবহার এবং অবশেষে একত্রে চেষ্টা ব্লকে রিসোর্সগুলি অর্জন এবং ব্যবহার করা, একটি ক্যাচ ব্লকে ব্যতিক্রমী পরিস্থিতিতে মোকাবিলা করা এবং শেষ অবধি রিসোর্সগুলি প্রকাশ করা।

এছাড়া পড়া মূল্য এই , যেটি বলে:

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

সুতরাং এটি স্পষ্ট যে কোনও ধারাটিতে থাকা কোডটি finallyকার্যকর করা হবে এমনকি পূর্বের catchধারাটিতে একটি returnবিবৃতি থাকলেও ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.