অবশেষে ব্লকগুলিতে ব্যতিক্রম ছোঁড়ে


100

finallyব্লক নিক্ষেপ করা ব্যতিক্রমগুলি পরিচালনা করার কি কোনও দুর্দান্ত উপায় আছে ?

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

try {
  // Use the resource.
}
catch( Exception ex ) {
  // Problem with the resource.
}
finally {
   try{
     resource.close();
   }
   catch( Exception ex ) {
     // Could not close the resource?
   }
}

আপনি কিভাবে এড়ানো না try/ catchfinallyব্লক?

উত্তর:


72

আমি সাধারণত এটি করে:

try {
  // Use the resource.
} catch( Exception ex ) {
  // Problem with the resource.
} finally {
  // Put away the resource.
  closeQuietly( resource );
}

অন্য কোথাও:

protected void closeQuietly( Resource resource ) {
  try {
    if (resource != null) {
      resource.close();
    }
  } catch( Exception ex ) {
    log( "Exception during Resource.close()", ex );
  }
}

4
ইয়াপ, আমি একটি খুব অনুরূপ প্রতিমা ব্যবহার। তবে আমি এর জন্য কোনও ফাংশন তৈরি করি না।
অস্কার রাইজ

9
যদি আপনাকে একই শ্রেণীর কয়েকটি জায়গায় আইডিয়মটি ব্যবহার করতে হয় তবে একটি ফাংশন হস্তে কার্যকর।
ডারন

নাল জন্য চেক অপ্রয়োজনীয়। যদি সংস্থানটি শূন্য হয়, তবে কল করার পদ্ধতিটি ভাঙ্গা ঠিক করা উচিত। এছাড়াও, যদি উত্সটি নাল হয়, তবে সম্ভবত এটি লগ করা উচিত। অন্যথায় এটি একটি সম্ভাব্য ব্যতিক্রমকে নিঃশব্দে উপেক্ষা করার ফলস্বরূপ।
ডেভ জার্ভিস

14
নাল জন্য চেক সবসময় অপ্রয়োজনীয় হয় না। "রিসোর্স = নতুন ফাইলআইপুট স্ট্রিম (" file.txt ")" চেষ্টা করে দেখুন line এছাড়াও, এই প্রশ্নটি দৃষ্টিভঙ্গি ভিত্তিক প্রোগ্রামিং সম্পর্কিত নয় যা অনেক লোক ব্যবহার করে না। যাইহোক, ব্যতিক্রমটিকে কেবল উপেক্ষা করা উচিত নয় এমন ধারণাটি একটি লগ স্টেটমেন্ট দেখিয়ে সর্বাধিক নিখুঁতভাবে পরিচালিত হয়েছিল।
ডারন


25

আমি সাধারণত এর মধ্যে একটি closeQuietlyপদ্ধতি ব্যবহার করি org.apache.commons.io.IOUtils:

public static void closeQuietly(OutputStream output) {
    try {
        if (output != null) {
            output.close();
        }
    } catch (IOException ioe) {
        // ignore
    }
}

4
আপনি ক্লোজযোগ্য পাবলিক স্ট্যাটিক শূন্যতা নিকটবর্তী কুইটলি (ক্লোজযোগ্য ক্লোজযোগ্য) এর সাহায্যে এই পদ্ধতিটিকে আরও সাধারণ করে তুলতে পারেন
Peter

6
হ্যাঁ, ক্লোজবেবল দুর্দান্ত। এটি লজ্জার বিষয় যে অনেক জিনিস (যেমন জেডিবিসি সংস্থানসমূহ) এটি প্রয়োগ করে না।
ডারন

22

আপনি যদি জাভা 7 ব্যবহার করছেন এবং resourceপ্রয়োগগুলি ব্যবহার করেন তবে আপনি এটি AutoClosableকরতে পারেন (উদাহরণ হিসাবে ইনপুট স্ট্রিম ব্যবহার করে):

try (InputStream resource = getInputStream()) {
  // Use the resource.
}
catch( Exception ex ) {
  // Problem with the resource.
}

8

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

Resource resource = null;
boolean isSuccess = false;
try {
    resource = Resource.create();
    resource.use();
    // Following line will only run if nothing above threw an exception.
    isSuccess = true;
} finally {
    if (resource != null) {
        if (isSuccess) {
            // let close throw the exception so it isn't swallowed.
            resource.close();
        } else {
            try {
                resource.close();
            } catch (ResourceException ignore) {
                // Just swallow this one because you don't want it 
                // to replace the one that came first (thrown above).
            }
        }
    }
}

আপডেট: আমি এটিকে আরও কিছুটা দেখেছি এবং আমার থেকে আরও স্পষ্টভাবে চিন্তাভাবনা করেছে এমন একজনের কাছ থেকে একটি দুর্দান্ত ব্লগ পোস্ট পেয়েছি: http://illegalargumentexception.blogspot.com/2008/10/java-how-not-to-make -মেস-অফ-স্ট্রিম। html তিনি আরও একধাপ এগিয়ে যান এবং দুটি ব্যতিক্রমকে এক সাথে সংযুক্ত করেন, যা আমি কিছু ক্ষেত্রে কার্যকর হতে দেখলাম।


4
ব্লগ লিঙ্কের জন্য +1। অতিরিক্ত হিসাবে, আমি কমপক্ষে ignoreব্যতিক্রমটি লগ করব
ডেনিস নিয়াজহেভ

6

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

নিম্নলিখিত কোডটি ধরুন:

try( Connection con = null;
     Statement stmt = con.createStatement();
     Result rs= stmt.executeQuery(QUERY);)
{  
     count = rs.getInt(1);
}

কোনও ব্যতিক্রম ঘটলে ঘনিষ্ঠ হয় পদ্ধতিটি এই তিনটি সংস্থার প্রত্যেককে বিপরীত ক্রমে ডাকা হবে যাতে তারা তৈরি হয়েছিল। এর অর্থ হ'ল নিকট পদ্ধতিটি প্রথমে রেজাল্টসেটেমের জন্য বিবৃতি দেওয়া হবে এবং তারপরে সংযোগ অবজেক্টের জন্য বলা হবে।

নিকটতম পদ্ধতিগুলি স্বয়ংক্রিয়ভাবে ডাকা হয় তখন যে কোনও ব্যতিক্রম ঘটে তা চাপা দেওয়াও জেনে রাখা গুরুত্বপূর্ণ। এই দমন করা ব্যতিক্রমগুলি থ্রোয়েবল ক্লাসে সংজ্ঞায়িত গেটসপ্রেসড () পদ্ধতি দ্বারা পুনরুদ্ধার করা যেতে পারে ।

উত্স: https://docs.oracle.com/javase/tutorial/essential/exception/tryResourceClose.html


এটি অসম্পূর্ণ বলে মনে হচ্ছে যে এই উত্তরটিতে এই পদ্ধতির মধ্যে আচরণের পার্থক্য এবং ওপি'র পোস্ট উদাহরণ কোডটি কীভাবে কাজ করে তা উল্লেখ করে না।
নাথান হিউজেস

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

এটি একটি ব্যতিক্রম ছুঁড়ে না, নিকট পদ্ধতিটি স্বয়ংক্রিয়ভাবে দমন করা হয় বলে ডাকা হয়।
Soroosh

4
আমি বর্ণিত মামলাটি চেষ্টা করুন। চেষ্টা করুন ব্লকটি সম্পূর্ণরূপে সম্পূর্ণ হয়, কিছু বন্ধ করে দেয়। এবং আপনি যে লিঙ্কটি পোস্ট করেছেন সে পৃষ্ঠাটি পুনরায় পড়ুন, দমন কেবল তখনই প্রযোজ্য হবে যখন চেষ্টা ব্লক কিছু নিক্ষেপ করে।
নাথান হিউজেস

3

'অবশেষে' ব্লকের মধ্যে ঘটে যাওয়া ব্যতিক্রমগুলি উপেক্ষা করা সাধারণত একটি খারাপ ধারণা হয় যদি না কেউ জানেন যে এই ব্যতিক্রমগুলি কী হবে এবং তারা কী পরিস্থিতিতে প্রতিনিধিত্ব করবে। সাধারণ try/finallyব্যবহারের ধরণে, tryব্লকটি এমন জিনিসগুলিকে এমন একটি স্থানে রাখে যে বাইরের কোডটি প্রত্যাশা করবে না এবংfinally ব্লকটি সেই জিনিসগুলির স্থিতিটি বাইরের কোডের প্রত্যাশা থেকে পুনরুদ্ধার করে। বাইরের কোড যা একটি ব্যতিক্রম ধরা দেয় তা সাধারণত আশা করবে যে ব্যতিক্রম সত্ত্বেও, সমস্ত কিছু একটিতে পুনরুদ্ধার করা হয়েছেnormalঅবস্থা. উদাহরণস্বরূপ, ধরুন কিছু কোড কোনও লেনদেন শুরু করে এবং তারপরে দুটি রেকর্ড যুক্ত করার চেষ্টা করে; "অবশেষে" ব্লকটি "প্রতিশ্রুতিবদ্ধ না হলে" রোলব্যাক সম্পাদন করে। দ্বিতীয় "অ্যাড" অপারেশনটি কার্যকর করার সময় কোনও কলার ব্যতিক্রম হওয়ার জন্য প্রস্তুত হতে পারে এবং আশা করতে পারে যে এটি যদি এই ধরনের ব্যতিক্রম ধরা পড়ে তবে উভয় অপারেশনের চেষ্টা করার আগে ডাটাবেসটি সেই অবস্থায় থাকবে। তবে, যদি রোলব্যাকের সময় দ্বিতীয় ব্যতিক্রম ঘটে, কলার যদি ডাটাবেস স্থিতি সম্পর্কে কোনও অনুমান করে তবে খারাপ জিনিস ঘটতে পারে। রোলব্যাক ব্যর্থতা একটি বড় সঙ্কটের প্রতিনিধিত্ব করে - যা কেবলমাত্র "রেকর্ড যুক্ত করতে ব্যর্থ" ব্যতিক্রম প্রত্যাশী কোড দ্বারা ধরা উচিত নয়।

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


2

একটি সমাধান, যদি দুটি ব্যতিক্রম দুটি ভিন্ন শ্রেণি হয়

try {
    ...
    }
catch(package1.Exception err)
   {
    ...
   }
catch(package2.Exception err)
   {
   ...
   }
finally
  {
  }

তবে কখনও কখনও আপনি এই দ্বিতীয় চেষ্টাটি এড়াতে পারবেন না। যেমন একটি স্ট্রিম বন্ধ করার জন্য

InputStream in=null;
try
 {
 in= new FileInputStream("File.txt");
 (..)// do something that might throw an exception during the analysis of the file, e.g. a SQL error
 }
catch(SQLException err)
 {
 //handle exception
 }
finally
 {
 //at the end, we close the file
 if(in!=null) try { in.close();} catch(IOException err) { /* ignore */ }
 }

আপনার ক্ষেত্রে যদি আপনি "ব্যবহার করে" বিবৃতি ব্যবহার করেন তবে এটি সংস্থানটি পরিষ্কার করে দেওয়া উচিত।
চক কনওয়ে

আমার খারাপ, আমি এটি সি # ধরে নিচ্ছি #
চক কনওয়ে

1

আপনি কেন অতিরিক্ত ব্লক এড়াতে চান? যেহেতু অবশেষে ব্লকটিতে "স্বাভাবিক" অপারেশন রয়েছে যা একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারে এবং আপনি অবশেষে ব্লকটি সম্পূর্ণরূপে চালিত হওয়া চান ব্যতিক্রমগুলি ধরার জন্য।

যদি আপনি অবশেষে অবরুদ্ধটিকে কোনও ব্যতিক্রম ছুঁড়ে ফেলার আশা করেন না এবং আপনি কীভাবে যেভাবে ব্যতিক্রম পরিচালনা করবেন তা জানেন না (আপনি কেবল স্ট্যাক ট্রেসটি ফেলে ফেলবেন) ব্যতিক্রমটি কল স্ট্যাকটি আপ করতে দিন (শেষ থেকে চেষ্টাটি সরিয়ে ফেলুন) ব্লক)।

আপনি যদি টাইপিং হ্রাস করতে চান তবে আপনি একটি "গ্লোবাল" বহিরাগত ট্রাই-ক্যাচ ব্লক বাস্তবায়ন করতে পারেন, যা শেষ অবধি ব্লকগুলিতে ছড়িয়ে দেওয়া সমস্ত ব্যতিক্রম ধরা পড়বে:

try {
    try {
        ...
    } catch (Exception ex) {
        ...
    } finally {
        ...
    }

    try {
        ...
    } catch (Exception ex) {
        ...
    } finally {
        ...
    }

    try {
        ...
    } catch (Exception ex) {
        ...
    } finally {
        ...
    }
} catch (Exception ex) {
    ...
}

4
-1 এটির জন্যও। আপনি যদি একক অবশেষে একাধিক সংস্থান বন্ধ করার চেষ্টা করছেন? প্রথম রিসোর্স বন্ধ করা যদি ব্যর্থ হয়, ব্যতিক্রম ছুঁড়ে ফেলা হলে অন্যগুলি উন্মুক্ত থাকবে।
আউটলা প্রোগ্রামার

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

1

প্রচুর বিবেচনার পরে, আমি নিম্নলিখিত কোডটি সেরা খুঁজে পাই:

MyResource resource = null;
try {
    resource = new MyResource();
    resource.doSomethingFancy();
    resource.close(); 
    resource = null;  
} finally {
    closeQuietly(resource)
}

void closeQuietly(MyResource a) {
    if (a!=null)
        try {
             a.close();
        } catch (Exception e) {
             //ignore
        }
}

এই কোডটি নিম্নলিখিত গ্যারান্টি দেয়:

  1. কোড শেষ হয়ে গেলে রিসোর্সটি মুক্ত হয়
  2. সংস্থানটি বন্ধ করার সময় নিক্ষিপ্ত ব্যতিক্রমগুলি প্রক্রিয়াজাতকরণ ব্যতীত গ্রাস করা হয় না।
  3. কোডটি দু'বার রিসোর্সটি বন্ধ করার চেষ্টা করে না, কোনও অপ্রয়োজনীয় ব্যতিক্রম তৈরি করা হবে না।

আপনি রিসোর্স.ক্লোজ () কল করা এড়াতে পারেন; রিসোর্স = ট্রায়াল ব্লকে নাল, যা অবশেষে ব্লকগুলির জন্য। এছাড়াও মনে রাখবেন যে "কিছু অভিনব কাজ করার সময়" ফেলে দেওয়া কোনও ব্যতিক্রমগুলি আপনি পরিচালনা করেন না, যা আসলে, আমি মনে করি যে আমি স্ট্যাকের নিচে একটি উচ্চতর অ্যাপ্লিকেশন স্তরে অবকাঠামোগত ব্যতিক্রমগুলি হ্যান্ডেল করার জন্য ভাল পছন্দ করি।
পল

রিসোর্স.ক্লোজ () হয়ত ফেলে দিতে পারে এবং ব্যতিক্রম করতে পারে - অর্থাত্ যখন বাফার ফ্লাশ ব্যর্থ হয়। এই ব্যতিক্রমটি কখনই গ্রাস করা উচিত নয়। তবে, পূর্বে উত্থাপিত ব্যতিক্রমের ফলস্বরূপ স্ট্রিমটি বন্ধ করা হলে, ব্যতিক্রমটিকে উপেক্ষা করে এবং মূল কারণটি সংরক্ষণ করে উত্সটি চুপচাপ বন্ধ করা উচিত।
গ্রোগি

0

যদি আপনি পারেন তবে ত্রুটি শর্তটি শুরু করতে এড়াতে আপনার পরীক্ষা করা উচিত।

try{...}
catch(NullArgumentException nae){...}
finally
{
  //or if resource had some useful function that tells you its open use that
  if (resource != null) 
  {
      resource.Close();
      resource = null;//just to be explicit about it was closed
  }
}

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


ব্যর্থতা ব্যয়বহুল হওয়ায় কেবল ত্রুটির শর্তগুলি পরীক্ষা করা একটি ভাল অনুশীলন।
ডার্ক ভোলমার 21

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

@ জো - সমস্ত ত্রুটির শর্তগুলির জন্য পরীক্ষায় আমি আপনার সাথে দ্বিমত পোষণ করি না, তবে কখনও কখনও ব্যতিক্রমের তুলনায় ব্যতিক্রম এড়াতে একটি সাধারণ চেক ব্যয় করে বিশেষত পার্থক্যের (সাধারণত) ব্যয়ের বিষয়টি বিবেচনা করে তা বোঝায়।
কেন হেন্ডারসন

4
-1 এখানে, উত্স। ক্লোজ () একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারে। আপনার যদি অতিরিক্ত সংস্থানগুলি বন্ধ করতে হয়, তবে ব্যতিক্রমটি ফাংশনটি ফিরিয়ে আনতে পারে এবং সেগুলি খোলা থাকবে। ওপিতে এটি দ্বিতীয় চেষ্টা / ধরা উদ্দেশ্য।
আউটলা প্রোগ্রামার

@ ওটলাও - আপনি যদি আমার ব্যপারটি মিস করছেন যদি ক্লোজ একটি ব্যতিক্রম ছুঁড়ে ফেলেছে, এবং উত্সটি তখন খোলা আছে ব্যতিক্রম ক্যাপচার এবং দমন করার মাধ্যমে আমি কীভাবে সমস্যাটি সংশোধন করব? তাই আমি কেন এটি প্রচার করতে দিলাম (এটির সাথে এটি এখনও খোলার সাথে আমি পুনরুদ্ধার করতে পারি এটির বিরল)।
কেন হেন্ডারসন

0

আপনি এটি অন্য পদ্ধতিতে রিফ্যাক্টর করতে পারেন ...

public void RealDoSuff()
{
   try
   { DoStuff(); }
   catch
   { // resource.close failed or something really weird is going on 
     // like an OutOfMemoryException 
   }
}

private void DoStuff() 
{
  try 
  {}
  catch
  {
  }
  finally 
  {
    if (resource != null) 
    {
      resource.close(); 
    }
  }
}

0

আমি সাধারণত এটি করি:

MyResource r = null;
try { 
   // use resource
} finally {   
    if( r != null ) try { 
        r.close(); 
    } catch( ThatSpecificExceptionOnClose teoc ){}
}

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

এটি এমন একটি ক্ষেত্রে যখন আমার পক্ষে অন্ততপক্ষে, এটি যাচাই করা ব্যতিক্রম উপেক্ষা করা নিরাপদ।

আজ অবধি আমার এই প্রতিমাটি ব্যবহার করতে কোনও সমস্যা হয়নি।


আমি এটি লগ করব, যদি ভবিষ্যতে আপনি কিছু ফুটো খুঁজে পান। এইভাবে আপনি জানতেন যে তারা কোথা থেকে আসতে পারে (না)
এগওয়ার

@ ইগওয়ার আমি আপনার সাথে একমত. এটি ছিল কিছু দ্রুত স্নিপেট। আমি এটিতে লগইন করেছি এবং প্রবিলি ব্যবহার করে ক্যাচ ব্যতিক্রম কিছু করা যায় :)
অস্কার রাইজ

0
try {
    final Resource resource = acquire();
    try {
        use(resource);
    } finally {
        resource.release();
    }
} catch (ResourceException exx) {
    ... sensible code ...
}

কাজ শেষ. নাল পরীক্ষা নেই। একক ক্যাচ, অর্জন এবং ব্যতিক্রম প্রকাশ অন্তর্ভুক্ত। অবশ্যই আপনি কাছাকাছি এক্সিকিউটটি ব্যবহার করতে পারেন এবং প্রতিটি সংস্থান টাইপের জন্য কেবল এটি একবার লিখতে হবে।


5
যদি ব্যবহার (সংস্থান) ব্যতিক্রম এ এবং তারপরে উত্স। রিলিজ () ব্যতিক্রম বি ছুঁড়ে? ব্যতিক্রম এ হারিয়ে গেছে ...
ডারন

0

পরিবর্তন Resourceথেকে সর্বোত্তম উত্তর থেকেCloseable

স্ট্রিম প্রয়োগগুলি Closeableসুতরাং আপনি সমস্ত স্ট্রিমের জন্য পদ্ধতিটি পুনরায় ব্যবহার করতে পারেন

protected void closeQuietly(Closeable resource) {
    if (resource == null) 
        return;
    try {
        resource.close();
    } catch (IOException e) {
        //log the exception
    }
}

0

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

IOException ioException = null;
try {
  outputStream.write("Something");
  outputStream.flush();
} catch (IOException e) {
  throw new ExportException("Unable to write to response stream", e);
}
finally {
  try {
    outputStream.close();
  } catch (IOException e) {
    ioException = e;
  }
}
if (ioException != null) {
  throw new ExportException("Unable to close outputstream", ioException);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.