আমরা অবশেষে ব্লকগুলি কেন ব্যবহার করব?


91

যতদূর আমি বলতে পারি, নিম্নলিখিত কোড স্নিপেট দুটি একই উদ্দেশ্যে পরিবেশন করবে। মোটেও finallyব্লকস কেন ?

কোড এ:

try { /* Some code */ }
catch { /* Exception handling code */ }
finally { /* Cleanup code */ }

কোড বি:

try { /* Some code */ }
catch { /* Exception handling code */ }
// Cleanup code

এটি সি # এর সাথে সুনির্দিষ্ট নয় এটি একটি নেট প্রশ্ন
সত্যই

4
জাভা with এর সাথে আর দরকার নেই: অটোমেটিক রিসোর্স ম্যানেজমেন্ট, চেষ্টা করুন (নতুন রিসোর্স বিবরণ ())}
Kan

উত্তর:


139
  • আপনি যদি পরিচালনা করছেন না এমন ব্যতিক্রম নিক্ষেপ হয়ে যায় তবে কী হবে? (আমি আশা করি আপনি ধরছেন না Throwable...)
  • আপনি যদি চেষ্টা ব্লকের ভিতরে থেকে ফিরে যান তবে কী হবে?
  • ক্যাচ ব্লক যদি ব্যতিক্রম ছুঁড়ে ফেলে তবে কি হবে?

একটি finallyব্লক নিশ্চিত করে যে আপনি সেই ব্লকটি (প্রস্থানটি পুরোপুরি স্পষ্টভাবে বাতিল করার কয়েকটি উপায়) প্রস্থান করলেও এটি কার্যকর হবে। সম্পদের নির্বিচারে পরিষ্কারের জন্য এটি গুরুত্বপূর্ণ।


48
অগত্যা সত্য নয়; অবশেষে মৃত্যুদন্ড কার্যকর করা হবে না (1) যদি System.exit()কল আসে (2) চেষ্টা করে বা একটি ক্যাচ ব্লকের একটি অসীম লুপ থাকে (3) আমি কম্পিউটারে প্লাগ
টানছি

4
@ অ্যালোন চেষ্টা করুন {ফিরুন 1; } অবশেষে {পুনরায় 2; } আপনি 2
ডেনিস সি

19
@ নাল ইউজার এক্সেপশন: অতএব "কিছু উপায় ..." বিট
জন স্কিট

4
জন স্কিটি এখানে স্ট্যাকওভারফ্লোতে বাস করে, প্রতিটি প্রশ্নের উত্তর দেওয়ার মতো একটি ডোরবেল বাজানোর মতোই হয় :)
নাইকাস

4
এই পোস্টটিতে (বিরল) অবস্থার বিষয়ে আলোচনা করা হয়েছে যার অধীনে ডাকা হবে না।
ক্যানডামির

13

নোট করুন (জাভাতে কমপক্ষে, সম্ভবত সি # তেও) একটি tryছাড়া ব্লক থাকাও সম্ভব catch, তবে একটি দিয়ে finally। যখন tryব্লকে কোনও ব্যতিক্রম ঘটে , finallyতখন ব্যতিক্রমটি আরও উপরে ছুঁড়ে ফেলার আগে ব্লকের কোডটি চালানো হয়:

InputStream in = new FileInputStream("somefile.xyz");
try {
    somethingThatMightThrowAnException();
}
finally {
    // cleanup here
    in.close();
}

7

আপনার চেষ্টা বা ক্যাচ ব্লকে যা ঘটে তা নির্বিশেষে আপনি যে কোডটি চান তা কার্যকর করতে চাইলে আপনি কোডটি রাখতে পারেন।

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

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

conn c1 = new connection();
try {
    c1.dosomething();
} catch (ExceptionA exa) {
    handleexA();
    //c1.close();
} catch (ExceptionB exb) {
    handleexB();
    //c1.close();
} finally {
    c1.close();
}

4
আমি যদি অবশেষে 'ব্যবহার না করে সংযোগটি বন্ধ করি তবে কী হবে?
ইসতিয়াক আহমেদ

5

অবশেষে সর্বদা কার্যকর করা হয়, যেখানে ক্যাচের পরে আপনার কোড হিসাবে নাও পারে।


4
কেন না! যদি ব্যতিক্রমটি সঠিকভাবে পরিচালনা করা হয় তবে কোডটি নির্ধারিতভাবে কার্যকর করা হবে।
মোহাম্মদ নাদিম

4
@ নাদিম: আমার উত্তর দেখুন 3 কারণে এটি না ঘটতে পারে।
জন স্কিটি

2

যদিও আমাদের অ্যাপ্লিকেশনটি জোর করে বন্ধ করা হয়েছে সেখানে কিছু কাজ হবে, যা আমাদের অবশ্যই সম্পাদন করতে হবে (যেমন মেমরি রিলিজ, ডাটাবেস বন্ধ করা, রিলিজ লক ইত্যাদি), আপনি যদি finallyব্লকে এই লাইন কোডগুলি লিখে থাকেন তবে এটি ব্যতিক্রম হবে কিনা তা কার্যকর করা হবে বা না...

আপনার অ্যাপ্লিকেশনটি থ্রেডের সংগ্রহ হতে পারে, Exceptionথ্রেডটি শেষ করে তবে পুরো অ্যাপ্লিকেশনটি নয়, এক্ষেত্রে finallyআরও দরকারী।

কিছু ক্ষেত্রে finallyযেমন JVM ফেল, থ্রেড টার্মিনেট ইত্যাদি কার্যকর করা হবে না


1

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


0

এমন অনেক সময় থাকতে পারে যখন আপনি কোনও কোডের টুকরো কার্যকর করতে চান না কেন। ব্যতিক্রম ছুঁড়ে দেওয়া হোক বা না হোক। তারপরে একটি ব্যবহার করে finally


0

finallyJVM বন্ধ না করা থাকলে সর্বদা চালানো হয়, finallyক্লিনআপ কোডটি এক জায়গায় রাখার জন্য কেবল একটি পদ্ধতি সরবরাহ করে।

আপনার যদি প্রতিটি catchব্লকের ক্লিন আপ কোডটি রাখতে হয় তবে এটি খুব ক্লান্তিকর হবে ।


0

যদি ক্যাচ ব্লক কোনও ব্যতিক্রম ছুঁড়ে ফেলেছে তবে অবশিষ্ট কোডটি কার্যকর হবে না তাই আমাদের ফাইনালি ব্লক লিখতে হবে।


0

অবশেষে জাভাতে ব্লকটি "ক্লিনআপ" কোড রাখতে ব্যবহৃত হতে পারে যেমন কোনও ফাইল বন্ধ করা, সংযোগ বন্ধ করা ইত্যাদি put


প্রোগ্রামটি প্রস্থান করা হলে (শেষ পর্যন্ত System.exit () কল করে বা একটি মারাত্মক ত্রুটির কারণ দ্বারা প্রক্রিয়াটি বাতিল হয়ে যায়) অবশেষে ব্লকটি কার্যকর করা হবে না।


0

এখনও নিচে স্ক্রোল করছি? এই যে!

এই প্রশ্নটি আমাকে কিছুক্ষণ পিছনে ফেলেছে।

try
{
 int a=1;
 int b=0;
 int c=a/b;
}
catch(Exception ex)
{
 console.writeline(ex.Message);
}
finally
{
 console.writeline("Finally block");
}
console.writeline("After finally");

উপরের দৃশ্যে কী ছাপা হবে? হ্যাঁ ঠিকই অনুমান করেছেন:

  • প্রাক্তন ম্যাসেজ - এটি যাই হোক না কেন (সম্ভবত শূন্য দ্বারা বিভাগের চেষ্টা করা হয়েছে)

  • অবশেষে অবরুদ্ধ

  • শেষ পর্যন্ত

    try
    {
        int a=1;
        int b=0;
        int c=a/b;
    }
    catch(Exception ex)
    {
        throw(ex);
    }
    finally
    {
        console.writeline("Finally block");
    }
    console.writeline("After finally");
    

কি এই মুদ্রণ হবে? কিছুই না! ক্যাচ ব্লকটি ত্রুটি উত্থাপন করার পরে এটি একটি ত্রুটি ছুঁড়ে দেয়।

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

try
{    
 try
    {
     int a=1;
     int b=0;
     int c=a/b;
    }
    catch(Exception ex)
    {
     throw(ex);
    }
    finally
    {
     console.writeline("Finally block")
    }
    console.writeline("After finally");
}
catch(Exception ex)
{
 console.writeline(ex.Message);
}

এই ক্ষেত্রে আউটপুট হবে:

  • অবশেষে অবরুদ্ধ
  • ex.Message - যাই হোক না কেন।

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

ক্যাচ ব্লকের পরে কোডগুলিতে কেন আপনার সংস্থানগুলি বন্ধ করবেন না তা আপনি এখনই জানেন finally এগুলি অবশেষে ব্লকে রাখুন।

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