চেষ্টা এবং শেষ চেষ্টা-মধ্যে পার্থক্য


91

এর মধ্যে পার্থক্য কী

try {
    fooBar();
} finally {
    barFoo();
}

এবং

try {
  fooBar();
} catch(Throwable throwable) {
    barFoo(throwable); // Does something with throwable, logs it, or handles it.
}

আমি দ্বিতীয় সংস্করণটি আরও ভাল পছন্দ করি কারণ এটি আমাকে থ্রোয়েবলের অ্যাক্সেস দেয়। দুটি ভিন্নতার মধ্যে কোনও যৌক্তিক পার্থক্য বা পছন্দের কনভেনশন কি আছে?

এছাড়াও, শেষ অবধি থেকে ব্যতিক্রমটি অ্যাক্সেস করার কোনও উপায় আছে?

উত্তর:


121

এই দুটি ভিন্ন জিনিস:

  • চেষ্টা ব্লকে যদি ব্যতিক্রম ছুঁড়ে দেওয়া হয় তবে কেবল ক্যাচ ব্লক কার্যকর করা হয়।
  • সর্বশেষ ব্লকটি সর্বদা চেষ্টা (-ক্যাচ) ব্লকের পরে কার্যকর করা হয়, যদি কোনও ব্যতিক্রম ছুঁড়ে দেওয়া হয় বা না হয়।

আপনার উদাহরণে আপনি তৃতীয় সম্ভাব্য নির্মাণটি দেখান নি:

try {
    // try to execute this statements...
}
catch( SpecificException e ) {
    // if a specific exception was thrown, handle it here
}
// ... more catches for specific exceptions can come here
catch( Exception e ) {
    // if a more general exception was thrown, handle it here
}
finally {
    // here you can clean things up afterwards
}

এবং, যেমন @ কোডেকা তাঁর মন্তব্যে বলেছেন, শেষ অবধি ব্লকের ভিতরে ব্যতিক্রম অ্যাক্সেস করার কোনও উপায় নেই, কারণ ব্যতিক্রম না থাকলেও শেষ অবধি কার্যকর করা হয় is

অবশ্যই আপনি একটি ভেরিয়েবল ঘোষণা করতে পারেন যা আপনার ব্লকের বাইরে ব্যতিক্রমকে ধারণ করে এবং ক্যাচ ব্লকের ভিতরে একটি মান নির্ধারণ করে। এর পরে আপনি আপনার অবশেষে ব্লকের ভিতরে এই পরিবর্তনকটি অ্যাক্সেস করতে পারেন।

Throwable throwable = null;
try {
    // do some stuff
}
catch( Throwable e ) {
    throwable = e;
}
finally {
    if( throwable != null ) {
        // handle it
    }
}

11
যে একটি সম্পুরক যে তুমি করতে পারবে না অ্যাক্সেস Throwableথেকে finally, ব্লক কারণ নাও হতে পারে হতে একটি Throwable
ডিন হার্ডিং

11

এগুলি কোনও প্রকরণ নয়, এগুলি মূলত বিভিন্ন জিনিস। সর্বদাfinally কার্যকর করা হয় , কেবলমাত্র যখন কোনও ব্যতিক্রম ঘটে।catch


7

পরিশেষে এবং ক্যাপ ব্লকগুলি একেবারে পৃথক:

  • ক্যাচ ব্লকের মধ্যে আপনি ছুঁড়ে দেওয়া ব্যতিক্রমটি সাড়া দিতে পারবেন। এই ব্লকটি কেবল তখনই কার্যকর করা হয় যদি সেখানে কোনও অযথিত ব্যতিক্রম থাকে এবং প্রকারটি একটির সাথে মেলে বা ক্যাচ ব্লকের প্যারামিটারে বর্ণিত একটির সাবক্লাস হয়।
  • শেষ পর্যন্ত সর্বদা চেষ্টা করার পরে কার্যকর করা হবে এবং ব্যতিক্রমগুলি উত্থাপিত হয়েছে কিনা তা ধরুন catch

তাই

try {
  //some code
}
catch (ExceptionA) {
  // Only gets executed if ExceptionA 
  // was thrown in try block
}
catch (ExceptionB) {
  // Only executed if ExceptionB was thrown in try 
  // and not handled by first catch block
}

থেকে পৃথক

try {
  //some code
}
finally {
  // Gets executed whether or not 
  // an exception was thrown in try block
}

উল্লেখযোগ্যভাবে

আপনি যদি একটি চেষ্টা ব্লক সংজ্ঞায়িত করেন তবে আপনাকে সংজ্ঞায়িত করতে হবে

  1. এক অবশেষে অবরুদ্ধ, বা
  2. এক বা একাধিক ক্যাচ ব্লক, বা
  3. এক বা একাধিক ক্যাচ ব্লক এবং একটি অবশেষে অবরুদ্ধ

সুতরাং নিম্নলিখিত কোডটিও বৈধ হবে:

try {
  //some code
}
catch (ExceptionA) {
  // Only gets executed if 
  // ExceptionA was thrown in try block
}
catch (ExceptionB) {
  // Only executed if ExceptionB was thrown in 
  // try and not handled by first catch block
}
//even more catch blocks
finally {
  // Gets executed whether or not an 
  // exception was thrown in try block
}

4

try এমন একটি পদ্ধতি চালাতে ব্যবহৃত হয় যা একটি ব্যতিক্রম ছুঁড়ে দিতে পারে

catch এই ব্যতিক্রমটি "ধরা" থামাতে ব্যবহৃত হয়

finally এই ব্যতিক্রম ধরা পড়ে বা না পাওয়া থেকে প্রয়োজনীয় কোনও ক্লিন আপের জন্য ব্যবহৃত হয়

try{
    myObject.riskyMethod(); // run a method that may throw an exception
}
catch(Exception ex){
    myLogger.log(ex.Message); // "catch" stop that exception
}
finally{
    myObject = null; // clean up needed from that exception being caught
}

3
try {
    statements;
} catch (exceptionType1 e1) {      // one or multiple
    statements;                 
} catch (exceptionType2 e2) {
    statements;
}    
...
} finally {                                 // one or none
    statements;
}
  1. সমস্ত চেষ্টা বিবৃতিতে অবশ্যই একটি ক্যাচ ক্লজ বা শেষ অবধি যুক্ত থাকতে হবে
  2. এটিতে একাধিক ক্যাচ ক্লজ থাকতে পারে তবে অবশেষে কেবল একটি ক্লজ
  3. যে কোনও নির্বাহের সময়, যদি কোনও ত্রুটি দেখা দেয় তবে নিয়ন্ত্রণটি যথাযথ ক্যাচ ব্লকে স্থানান্তরিত হয় এবং বিবৃতিগুলি কার্যকর করে এবং অবশেষে ব্লকটি কার্যকর করা হয়।

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


3

পরিশেষে এবং ক্যাপ ব্লকগুলি একেবারে পৃথক:

ক্যাচ ব্লকের মধ্যে আপনি ছুঁড়ে দেওয়া ব্যতিক্রমটি সাড়া দিতে পারবেন। এই ব্লকটি কেবল তখনই কার্যকর করা হয় যদি সেখানে কোনও অযথিত ব্যতিক্রম থাকে এবং প্রকারটি একটির সাথে মেলে বা ক্যাচ ব্লকের প্যারামিটারে বর্ণিত একটির সাবক্লাস হয়। শেষ পর্যন্ত সর্বদা চেষ্টা করার পরে কার্যকর করা হবে এবং ব্যতিক্রমগুলি উত্থাপিত হয়েছে কিনা তা ধরুন catch


2

আমার রিসার্চে শেষ পর্যন্ত ব্লকটি সর্বদা কার্যকর করা হয় এবং এটি মূলত "বন্ধ করার জন্য কোনও উন্মুক্ত সংযোগের জন্য" ব্যবহৃত হয় এবং অযথা চালিত কোনও কিছু ধ্বংস করতে হয়।


2

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

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class ReadData_Demo {

   public static void main(String args[]){
      FileReader fr=null;       
      try{
         File file=new File("file.txt");
         fr = new FileReader(file);  char [] a = new char[50];
         fr.read(a); // reads the content to the array
         for(char c : a)
         System.out.print(c); //prints the characters one by one
      }catch(IOException e){
          e.printStackTrace();
       }
       finally{ 
          try{
              fr.close();
          }catch(IOException ex){       
               ex.printStackTrace();
           }
       }
    }

}

আমার মতো অন্যান্য ছেলেরাও এরকম কিছু অনুসন্ধান করেছিল।

এই পাতা থেকে তথ্য tutpoint


1

অবশেষে ব্লক সর্বদা কার্যকর করা হয়। ব্লক প্যারামিটারের সাথে মেলে এমন একটি ব্যতিক্রম ক্যাপ ব্লক কেবল তখনই কার্যকর করা হয়।


1

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


0

ব্লক চেষ্টা করুন যে বিবৃতি ব্যতিক্রম বাড়াতে হবে তা ধরে রাখবে। ক্যাচ ব্লকটি চেষ্টা ব্লক থেকে ফেলে দেওয়া রেফারেন্স ধরে রাখবে এবং ক্যাচ ব্লক থেকে প্রয়োজনীয় বার্তা উত্পন্ন হয়। অবশেষে ব্লকটি আইও বন্ধকরণ, ফাইল বন্ধকরণ, ডিবি বন্ধকরণের মতো ব্যবহৃত সংস্থানগুলি বন্ধ করতে ব্যবহার করা হয় .. জাভা -9-এ উন্নত চেষ্টা সহ রিসোর্স উপস্থিত হয়েছিল যেখানে রিসোর্সগুলি চেষ্টা করার বাইরে ঘোষণা করা হয় ... রিসোর্স দিয়ে ক্যাচ ব্লকের সাথে বর্ধিত চেষ্টা করা হয়েছে আবশ্যক

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