বিঘ্নিত এক্সসেপশন পরিচালনা করার নিম্নলিখিত পদ্ধতির মধ্যে পার্থক্য কী? এটা করার সবচেয়ে ভালো উপায় কি?
আপনি সম্ভবত এই প্রশ্নটি করতে এসেছেন কারণ আপনি এমন একটি পদ্ধতি বলেছেন যা ছুড়ে ফেলে InterruptedException।
সবার আগে, আপনার এটি দেখতে throws InterruptedExceptionহবে: পদ্ধতির স্বাক্ষরের একটি অংশ এবং আপনি যে পদ্ধতিতে কল করছেন তার কল করার সম্ভাব্য ফলাফল। সুতরাং InterruptedExceptionএটিকে বাস্তবায়নের মাধ্যমে শুরু করুন যে পদ্ধতি পদ্ধতিতে একটি সঠিক বৈধ ফলাফল।
এখন, আপনি যে পদ্ধতিটিকে কল করছেন সেইরকম ব্যতিক্রম ছুঁড়ে ফেললে, আপনার পদ্ধতিটি কী করা উচিত ? আপনি নিম্নলিখিতটি সম্পর্কে চিন্তা করে উত্তরটি বের করতে পারেন:
এটা পদ্ধতির জন্য জানার আপনি একটি নিক্ষেপ করতে বাস্তবায়ন করছি InterruptedException? অন্যভাবে বলুন, আপনার পদ্ধতিটি InterruptedExceptionকল করার সময় কোনও বুদ্ধিমান ফলাফল কি?
যদি হ্যাঁ , তবে আপনার পদ্ধতির স্বাক্ষরের throws InterruptedExceptionঅংশ হওয়া উচিত এবং আপনার ব্যতিক্রমটি প্রচার করতে দেওয়া উচিত (অর্থাত্ এটি একেবারেই ধরবেন না)।
উদাহরণ : আপনার পদ্ধতিটি গণনা শেষ করতে এবং ফলাফল ফিরে পেতে নেটওয়ার্ক থেকে কোনও মানের জন্য অপেক্ষা করে। যদি ব্লকিং নেটওয়ার্ক কল কোনও ছুড়ে দেয় তবে InterruptedExceptionআপনার পদ্ধতিটি কোনও সাধারণ উপায়ে গণনা শেষ করতে পারে না। আপনি InterruptedExceptionপ্রচার করতে দিন ।
int computeSum(Server server) throws InterruptedException {
// Any InterruptedException thrown below is propagated
int a = server.getValueA();
int b = server.getValueB();
return a + b;
}
যদি না হয় , তবে আপনার সাথে আপনার পদ্ধতিটি ঘোষণা করা উচিত নয় throws InterruptedExceptionএবং আপনার অবশ্যই (অবশ্যই!) ব্যতিক্রমটি ধরা উচিত। এই পরিস্থিতিতে দুটি বিষয় অবশ্যই মনে রাখা গুরুত্বপূর্ণ:
কেউ আপনার থ্রেড বাধা দিয়েছে। যে কেউ সম্ভবত অপারেশন বাতিল করতে আগ্রহী, প্রোগ্রামটি নিখুঁতভাবে শেষ করতে, বা যা কিছু হোক না কেন। আপনার সেই ব্যক্তির প্রতি বিনয়ী হওয়া উচিত এবং আপনার পদ্ধতি থেকে কোনও পদক্ষেপ না নিয়ে ফিরে আসা উচিত।
যদিও আপনার পদ্ধতিটি InterruptedExceptionথ্রেডটি বাধাগ্রস্ত হয়েছে এমন পরিস্থিতিতে ক্ষেত্রে একটি বুদ্ধিমান রিটার্ন মান উত্পাদন করতে পারে তা এখনও গুরুত্বপূর্ণ হতে পারে। বিশেষত, কোডটি যা আপনার পদ্ধতিটিকে কল করে তা আপনার পদ্ধতির কার্যকর করার সময় কোনও বাধা সৃষ্টি হয়েছে কিনা তা সম্পর্কে আগ্রহী হতে পারে। সুতরাং আপনার বাধিত পতাকাটি নির্ধারণ করে কোনও বাধা সৃষ্টি হয়েছিল তা লগ করা উচিত:Thread.currentThread().interrupt()
উদাহরণ : ব্যবহারকারী দুটি মানের একটি যোগফল মুদ্রণ করতে বলেছে। মুদ্রণটি " Failed to compute sum" গ্রহণযোগ্য হয় যদি যোগফলটি গণনা করা যায় না (এবং কোনও কারণে স্ট্যাক ট্রেসের সাহায্যে প্রোগ্রামটি ক্র্যাশ হওয়ার চেয়ে অনেক ভাল InterruptedException)। অন্য কথায়, এটা নেই না দিয়ে এই পদ্ধতি ডিক্লেয়ার জানার জন্য throws InterruptedException।
void printSum(Server server) {
try {
int sum = computeSum(server);
System.out.println("Sum: " + sum);
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // set interrupt flag
System.out.println("Failed to compute sum");
}
}
এতক্ষণে এটি পরিষ্কার হওয়া উচিত যে কেবল করাটাই throw new RuntimeException(e)একটি খারাপ ধারণা। এটি কলারের কাছে খুব নম্র নয়। আপনি একটি নতুন রানটাইম ব্যতিক্রম উদ্ভাবন করতে পারেন তবে মূল কারণ (কেউ থ্রেড কার্যকর করা বন্ধ করতে চায়) হারিয়ে যেতে পারে।
অন্যান্য উদাহরণ:
বাস্তবায়নRunnable : আপনি যেমন আবিষ্কার করেছেন, এর স্বাক্ষর Runnable.runপুনর্বিবেচনার অনুমতি দেয় না InterruptedExceptions। ঠিক আছে, আপনি বাস্তবায়নে সাইন আপ করেছেন Runnableযার অর্থ আপনি সম্ভাব্যতার সাথে চুক্তি করতে সাইন আপ করেছেন InterruptedExceptions। হয় আলাদা ইন্টারফেস চয়ন করুন, যেমন Callable, বা উপরের দ্বিতীয় পদ্ধতির অনুসরণ করুন।
কলিংThread.sleep : আপনি কোনও ফাইল পড়ার চেষ্টা করছেন এবং অনুমান অনুসারে আপনার মধ্যে 1 সেকেন্ডের মধ্যে 10 বার চেষ্টা করা উচিত। আপনি কল Thread.sleep(1000)। সুতরাং, আপনি মোকাবেলা করা প্রয়োজন InterruptedException। কোনও পদ্ধতির জন্য tryToReadFileএটি সঠিকভাবে বোঝায় যে, "যদি আমার বাধা থাকে তবে আমি ফাইলটি পড়ার চেষ্টা করার আমার ক্রিয়াটি শেষ করতে পারি না" । অন্য কথায়, পদ্ধতিটি নিক্ষেপ করার জন্য এটি সঠিক ধারণা তৈরি করে InterruptedExceptions।
String tryToReadFile(File f) throws InterruptedException {
for (int i = 0; i < 10; i++) {
if (f.exists())
return readFile(f);
Thread.sleep(1000);
}
return null;
}
এই পোস্টটি এখানে একটি নিবন্ধ হিসাবে আবার লেখা হয়েছে ।