উত্তর:
সাধারণত, কখনও না।
তবে, কখনও কখনও আপনার নির্দিষ্ট ত্রুটিগুলি ধরতে হবে।
যদি আপনি ফ্রেমওয়ার্ক-ইশ কোড লিখছেন (তৃতীয় পক্ষের ক্লাসগুলি লোড করা হচ্ছে), এটি ধরা বুদ্ধিমান হতে পারে LinkageError(কোনও শ্রেণি ডিএফ পাওয়া যায়নি, অসন্তুষ্ট লিঙ্কটি নয়, বেমানান শ্রেণিবিন্যাস)।
আমি কিছু বোকা তৃতীয়-পক্ষের কোডগুলি সাবক্লাস ছুঁড়ে মারতেও দেখেছি Error, সুতরাং আপনার সেগুলিও পরিচালনা করতে হবে।
যাইহোক, আমি নিশ্চিত যে এটি থেকে পুনরুদ্ধার করা সম্ভব নয় OutOfMemoryError।
কখনও। আপনি কখনই নিশ্চিত হতে পারবেন না যে অ্যাপ্লিকেশনটি পরবর্তী পংক্তির কোডটি কার্যকর করতে সক্ষম। যদি আপনি একটি পান তবেOutOfMemoryError আপনার কোনও গ্যারান্টি নেই যে আপনি নির্ভরযোগ্যভাবে কিছু করতে সক্ষম হবেন । রানটাইম এক্সেপশন ধরুন এবং ব্যতিক্রমগুলি যাচাই করা হয়েছে, তবে কখনও ত্রুটি নেই।
boolean assertionsEnabled = false; assert assertionsEnabled = true;
সাধারণত আপনার সবসময় java.lang.Errorএটি কোনও লগতে ধরা এবং লিখতে হবে বা এটি ব্যবহারকারীর কাছে প্রদর্শন করা উচিত। আমি সহায়তায় কাজ করি এবং প্রতিদিন দেখি যে প্রোগ্রামাররা কোনও প্রোগ্রামে কী ঘটেছিল তা বলতে পারে না।
আপনার যদি ডেমন থ্রেড থাকে তবে আপনার অবশ্যই এটি বন্ধ করে দেওয়া উচিত। অন্যান্য ক্ষেত্রে আপনার অ্যাপ্লিকেশন সঠিকভাবে কাজ করবে।
আপনার কেবল java.lang.Errorউচ্চ স্তরে ধরা উচিত ।
ত্রুটির তালিকার দিকে নজর দিলে আপনি দেখতে পাবেন যে বেশিরভাগটি পরিচালনা করা যায়। উদাহরণস্বরূপ ZipErrorদুর্নীতিগ্রস্থ জিপ ফাইলগুলি পড়ার ক্ষেত্রে একটি ঘটনা ঘটে।
সর্বাধিক সাধারণ ত্রুটিগুলি OutOfMemoryErrorএবং NoClassDefFoundErrorএটি উভয়ই বেশিরভাগ ক্ষেত্রে রানটাইম সমস্যা।
উদাহরণ স্বরূপ:
int length = Integer.parseInt(xyz);
byte[] buffer = new byte[length];
একটি উত্পাদন করতে পারে OutOfMemoryErrorতবে এটি একটি রানটাইম সমস্যা এবং আপনার প্রোগ্রামটি বন্ধ করার কোনও কারণ নয়।
NoClassDefFoundErrorলাইব্রেরি উপস্থিত না থাকলে বা আপনি অন্য জাভা সংস্করণের সাথে কাজ করে থাকেন তবে বেশিরভাগ ক্ষেত্রে ঘটে। এটি যদি আপনার প্রোগ্রামের alচ্ছিক অংশ হয় তবে আপনার প্রোগ্রামটি শেষ করা উচিত নয়।
Throwableশীর্ষ স্তরে ধরা এবং একটি সহায়ক ত্রুটি বার্তা উত্পন্ন করার জন্য কেন এটি ভাল ধারণা কেন আমি তার আরও অনেক উদাহরণ দিতে পারি ।
OutOfMemoryErrorরানটাইম ত্রুটি নয় যা অ্যাপ্লিকেশনটি এটি থেকে পুনরুদ্ধার করতে পারে তার কোনও গ্যারান্টি নেই। আপনি যদি ভাগ্যবান হন new byte[largeNumber]তবে আপনি OOM এ পেতে পারেন তবে যদি সেই বরাদ্দ OOM এর পক্ষে যথেষ্ট না হয় তবে এটি পরবর্তী লাইনে বা পরবর্তী থ্রেডে ট্রিগার হতে পারে। এটি রানটাইম সমস্যা কারণ lengthঅবিশ্বস্ত ইনপুট থাকলে এটি কল করার আগে বৈধ হওয়া উচিত new byte[]।
NoClassDefFoundErrorযে কোনও জায়গায় ঘটতে পারে , যখন জাভা কোডটি সংকলিত হয় তখন এটি ক্লোজ করা যায় না। যদি আপনার জেডিকে ভুল কনফিগার করা থাকে তবে এটি java.util.*শ্রেণি ব্যবহারের চেষ্টা থেকে ট্রিগার করতে পারে এবং এর বিরুদ্ধে প্রোগ্রাম করা কার্যত অসম্ভব। আপনি যদি বিকল্পভাবে নির্ভরতা সহ অন্তর্ভুক্ত থাকেন তবে আপনার উপস্থিতি আছে ClassLoaderকিনা তা যাচাই করার জন্য আপনার ব্যবহার করা উচিত যা কোনটি ছুঁড়ে ClassNotFoundException।
ZipErrorনির্দেশ করে যে ক্লাসগুলি সহ জার ফাইলটি একটি দূষিত জিপ ফাইল। এটি বেশ গুরুতর সমস্যা এবং এই মুহুর্তে আপনি কার্যকর হওয়া কোনও কোডকে বিশ্বাস করতে পারবেন না এবং এটি থেকে "পুনরুদ্ধার" করার চেষ্টা করার জন্য এটি দায়িত্বজ্ঞানহীন বিষয় হবে।
java.lang.Errorবা java.lang.Throwableশীর্ষ স্তরে এবং এটির সাথে কিছু করার চেষ্টা করতে সহায়ক হতে পারে - লগ করে একটি ত্রুটি বার্তা বলুন। তবে সেই সময়ে এটি কার্যকর করা হবে এমন কোনও গ্যারান্টি নেই। যদি আপনার জেভিএম ওওমিং হয় তবে লগ করার চেষ্টা করতে আরও Stringগুলি বরাদ্দ হতে পারে যা অন্য ওওএমকে ট্রিগার করে।
বহুবিবাহিত পরিবেশে আপনি প্রায়শই এটি ধরতে চান! আপনি যখন এটি ধরেন, লগইন করুন এবং পুরো অ্যাপ্লিকেশনটি সমাপ্ত করুন! যদি আপনি এটি না করেন তবে কিছু থ্রেড যা কিছু গুরুত্বপূর্ণ অংশটি করছিল তা মৃত হবে এবং অ্যাপ্লিকেশনটির বাকি অংশগুলি মনে করবে যে সবকিছু স্বাভাবিক। এর মধ্যে থেকে অনেক অযাচিত পরিস্থিতি ঘটতে পারে। একটি ক্ষুদ্রতম সমস্যা হ'ল একটি থ্রেড কাজ না করার কারণে যদি অন্য থ্রেডগুলি কিছু ব্যতিক্রম ছুঁড়তে শুরু করে তবে আপনি সমস্যার মূলটি সহজেই সন্ধান করতে পারবেন না।
উদাহরণস্বরূপ, সাধারণত লুপটি হওয়া উচিত:
try {
while (shouldRun()) {
doSomething();
}
}
catch (Throwable t) {
log(t);
stop();
System.exit(1);
}
এমনকি কিছু ক্ষেত্রে, আপনি পৃথক পৃথক ত্রুটিগুলি আলাদাভাবে পরিচালনা করতে চাইবেন, উদাহরণস্বরূপ, আউটঅফমিউরিওররে আপনি নিয়মিত অ্যাপ্লিকেশনটি বন্ধ করতে সক্ষম হবেন (এমনকি কিছু স্মৃতি মুক্তও করতে পারেন এবং চালিয়ে যেতে পারেন), অন্য কিছুতে, আপনার করার মতো খুব বেশি কিছু নেই।
OutOfMemoryError এবং চালিয়ে যাওয়া বুদ্ধিমানের কারণ আপনার প্রোগ্রামটি তখন একটি সংজ্ঞায়িত অবস্থায় রয়েছে ।
একটি Errorসাধারণত ধরা উচিত নয় , কারণ এটি এমন অস্বাভাবিক অবস্থা নির্দেশ করে যা কখনই ঘটে না ।
Errorশ্রেণীর জন্য জাভা এপিআই স্পেসিফিকেশন থেকে :
একটি
Errorএটি একটি সাবক্লাসThrowableযা গুরুতর সমস্যাগুলি নির্দেশ করে যা যুক্তিসঙ্গত প্রয়োগটি ধরার চেষ্টা করা উচিত নয়। এ জাতীয় বেশিরভাগ ত্রুটিগুলি অস্বাভাবিক শর্ত। [...]কোনও পদ্ধতিতে এর ছোঁড়াছুটিতে ত্রুটির কোনও সাবক্লাস ক্লজ করার দরকার নেই যা পদ্ধতিটি কার্যকর করার সময় নিক্ষেপ করা হতে পারে তবে ধরা পড়ে না, কারণ এই ত্রুটিগুলি অস্বাভাবিক পরিস্থিতি যা কখনই ঘটে না।
স্পেসিফিকেশনটিতে যেমন উল্লেখ করা হয়েছে, একটি Errorকেবল এমন পরিস্থিতিতে ফেলে দেওয়া হয় যা সম্ভাবনা থাকে, যখন Errorঘটে থাকে তখন অ্যাপ্লিকেশনটি খুব কম করতে পারে এবং কিছু পরিস্থিতিতে জাভা ভার্চুয়াল মেশিন নিজেই অস্থির অবস্থায় থাকতে পারে (যেমন VirtualMachineError)
যদিও Errorএটি একটি সাবক্লাস Throwableযার অর্থ এটি একটি try-catchধারা দ্বারা ধরা পড়তে পারে তবে এটি সম্ভবত সত্যই প্রয়োজন হয় না, কারণ অ্যাপ্লিকেশনটি অস্বাভাবিক অবস্থায় থাকবে যখন একটিError জেভিএম দ্বারা নিক্ষেপ করা
এছাড়া বিভাগের এই বিষয়ে একটি সংক্ষিপ্ত অধ্যায় 11.5 ব্যতিক্রম শ্রেণীক্রম এর জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশন, 2nd সংস্করণ ।
এবং এমন আরও বেশ কয়েকটি কেস রয়েছে যেখানে আপনি কোনও ত্রুটি ধরা পড়লে আপনাকে এটিকে পুনর্বিবেচনা করতে হবে । উদাহরণ স্বরূপ থ্রেডডিথকে কখনই ধরা উচিত নয়, এটি কোনও বৃহত সমস্যার কারণ হতে পারে আপনি এটি কোনও পরিবেশে (যেমন অ্যাপ্লিকেশন সার্ভার) ধরলে :
একটি অ্যাপ্লিকেশনটির এই শ্রেণীর উদাহরণগুলি কেবল তখনই ধরা উচিত যখন এটি অ্যাসিক্রোনালিকভাবে সমাপ্ত হওয়ার পরে পরিষ্কার করা উচিত। থ্রেডডিথ যদি কোনও পদ্ধতির দ্বারা ধরা পড়ে তবে থ্রেডটি আসলে মারা যায় এমনটি পুনর্নির্মাণ করা গুরুত্বপূর্ণ is
Error ।
খুব, খুব কমই।
আমি এটি কেবল একটি খুব নির্দিষ্ট নির্দিষ্ট কেসের জন্য করেছি। উদাহরণস্বরূপ, java.lang.UnsatisectedLinkError নিক্ষিপ্ত হতে পারে যদি দুটি স্বাধীনতা ClassLoader একই ডিএলএল লোড করে। (আমি সম্মত হই যে আমার জেআর একটি ভাগ করা শ্রেণীবদ্ধে স্থানান্তর করা উচিত)
তবে সর্বাধিক সাধারণ ক্ষেত্রে হ'ল ব্যবহারকারী যখন অভিযোগ করতে আসে তখন কী ঘটেছিল তা জানতে আপনার লগিংয়ের প্রয়োজন ছিল। আপনি ব্যবহারকারীকে একটি বার্তা বা একটি পপআপ চান, বরং নীরবে মৃত।
এমনকি সি / সি ++ তে প্রোগ্রামার, তারা একটি ত্রুটি পপ করে এবং কিছু বেরোনোর আগে লোকেরা বুঝতে পারে না (যেমন মেমরির ব্যর্থতা)।
একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশনটিতে আমি একটি java.lang.VerifyError ধরছি । আমি যে লাইব্রেরিটি ব্যবহার করছি সেটি ওএস এবং পুস্তকাগুলির কোড সহ পুরানো সংস্করণযুক্ত ডিভাইসে কাজ করবে না such আমি অবশ্যই রানটাইমে ওএস এর সংস্করণ পরীক্ষা করে ত্রুটিটি এড়াতে পারতাম, তবে:
আদর্শভাবে আমাদের ত্রুটিগুলি পরিচালনা / ধরা উচিত নয়। কাঠামো বা প্রয়োগের প্রয়োজনীয়তার উপর ভিত্তি করে এমন কিছু ক্ষেত্রে থাকতে পারে যেখানে আমাদের করা দরকার। বলুন আমার কাছে একটি এক্সএমএল পার্সার ডেমন রয়েছে যা ডিওএম পার্সার প্রয়োগ করে যা আরও বেশি মেমরি গ্রহণ করে। যদি আউটআফমিউরিওর পাওয়া যায় তখন পার্সারের থ্রেডটি মারা উচিত নয় , পরিবর্তে এটি হ্যান্ডেল করা উচিত এবং অ্যাপ্লিকেশন / কাঠামোর প্রশাসকের কাছে একটি বার্তা / মেল প্রেরণ করা উচিত।
একটি ত্রুটি আছে যখন জেভিএম প্রত্যাশার মতো আর কাজ করে না বা চলে যাওয়ার পথে। আপনি যদি কোনও ত্রুটি ধরা পড়েন, তবে ক্যাচ ব্লকটি চলবে কিনা তার কোনও গ্যারান্টি নেই এবং এটি শেষ অবধি চালিত হবে less
এটি চলমান কম্পিউটারের উপর নির্ভর করবে, বর্তমান মেমরির অবস্থার উপর নির্ভর করে, তাই আপনার সর্বোত্তম চেষ্টা করার, চেষ্টা করার এবং করার কোনও উপায় নেই। আপনার কেবলমাত্র একটি প্রচুর ফলাফল হবে।
আপনি আপনার কোডের পঠনযোগ্যতাও হ্রাস করবেন।