এটা ধরা Throwable
কি খারাপ অভ্যাস ?
উদাহরণস্বরূপ:
try {
// Some code
} catch(Throwable e) {
// handle the exception
}
এটি কি একটি খারাপ অভ্যাস বা আমাদের যথাসম্ভব নির্দিষ্ট হওয়া উচিত?
এটা ধরা Throwable
কি খারাপ অভ্যাস ?
উদাহরণস্বরূপ:
try {
// Some code
} catch(Throwable e) {
// handle the exception
}
এটি কি একটি খারাপ অভ্যাস বা আমাদের যথাসম্ভব নির্দিষ্ট হওয়া উচিত?
উত্তর:
আপনার যথাসম্ভব সুনির্দিষ্ট হওয়া দরকার। অন্যথায় অপ্রত্যাশিত বাগগুলি এভাবেই সরে যেতে পারে।
এছাড়াও, Throwable
কভারগুলি Error
পাশাপাশি এবং এটির কোনও ফিরতি নেই । আপনি এটি ধরতে / পরিচালনা করতে চান না, আপনি চান আপনার প্রোগ্রামটি অবিলম্বে মারা যেতে পারে যাতে আপনি এটি সঠিকভাবে ঠিক করতে পারেন।
এটি একটি খারাপ ধারণা। আসলে, এমনকি ধরা Exception
সাধারণত একটি খারাপ ধারণা। আসুন একটি উদাহরণ বিবেচনা করুন:
try {
inputNumber = NumberFormat.getInstance().formatNumber( getUserInput() );
} catch(Throwable e) {
inputNumber = 10; //Default, user did not enter valid number
}
এখন, আসুন আমরা বলি যে getUserInput () কিছু সময়ের জন্য অবরুদ্ধ হয় এবং অন্য থ্রেডটি আপনার থ্রেডটিকে সবচেয়ে খারাপভাবে থামায় (এটি থ্রেড.স্টপ () বলে) আপনার ক্যাচ ব্লকে একটি ThreadDeath
ত্রুটি ধরা পড়বে । এটি অত্যন্ত খারাপ। ব্যতিক্রম ধরা পরে আপনার কোডের আচরণটি মূলত অপরিজ্ঞাত।
ব্যতিক্রম ধরার ক্ষেত্রেও একই রকম সমস্যা দেখা দেয়। হয়তো getUserInput()
একটি InterruptException ব্যর্থ, অথবা ফলাফল, বা অন্যান্য ব্যর্থতা সমস্ত প্রকারের লগ ইন করার চেষ্টা করার সময় একটি অনুমতির ব্যতিক্রম অস্বীকার করেছেন। কী ভুল হয়েছে তা আপনার কোনও ধারণা নেই, কারণ এটির কারণে, সমস্যাটি কীভাবে ঠিক করবেন সে সম্পর্কেও আপনার কোনও ধারণা নেই।
আপনার কাছে আরও তিনটি ভাল বিকল্প রয়েছে:
1 - আপনি কীভাবে পরিচালনা করতে জানেন ঠিক তেমন ব্যতিক্রম (গুলি) ধরুন:
try {
inputNumber = NumberFormat.getInstance().formatNumber( getUserInput() );
} catch(ParseException e) {
inputNumber = 10; //Default, user did not enter valid number
}
2 - আপনি যে কোনও ব্যতিক্রম নিয়ে চলেছেন তা রিথ্রো এবং কীভাবে পরিচালনা করবেন তা জানেন না:
try {
doSomethingMysterious();
} catch(Exception e) {
log.error("Oh man, something bad and mysterious happened",e);
throw e;
}
3 - একটি অবশেষে ব্লক ব্যবহার করুন যাতে আপনাকে পুনর্বিবেচনা করতে মনে রাখতে হবে না:
Resources r = null;
try {
r = allocateSomeResources();
doSomething(r);
} finally {
if(r!=null) cleanUpResources(r);
}
throw new Exception("Some additional info, eg. userId " + userId, e);
। এটি 10 কারণে একটি দুর্দান্ত ব্যতিক্রম লগ ইন করা হবে।
এছাড়াও সচেতন হন যে আপনি যখন ধরেন তখন আপনি Throwable
এটিও ধরতে পারেন InterruptedException
যা একটি বিশেষ চিকিত্সার প্রয়োজন। আরও বিশদের জন্য বিঘ্নিত ধারণা নিয়ে কাজ করা দেখুন De
আপনি যদি কেবল চেক না করা ব্যতিক্রমগুলি ধরতে চান তবে আপনি এই প্যাটার্নটিও বিবেচনা করতে পারেন
try {
...
} catch (RuntimeException exception) {
//do something
} catch (Error error) {
//do something
}
এইভাবে, আপনি যখন নিজের কোডটি সংশোধন করবেন এবং এমন কোনও মেথড কল যুক্ত করুন যা একটি পরীক্ষিত ব্যতিক্রম ছুঁড়ে ফেলতে পারে, সংকলক আপনাকে সেটির কথা মনে করিয়ে দেবে এবং তারপরে আপনি এই ক্ষেত্রে কী করবেন তা সিদ্ধান্ত নিতে পারেন।
ত্রুটি শ্রেণীর জাভাদোক থেকে সরাসরি (যা এগুলি না ধরার পরামর্শ দেয়):
* An <code>Error</code> is a subclass of <code>Throwable</code>
* that indicates serious problems that a reasonable application
* should not try to catch. Most such errors are abnormal conditions.
* The <code>ThreadDeath</code> error, though a "normal" condition,
* is also a subclass of <code>Error</code> because most applications
* should not try to catch it.
* A method is not required to declare in its <code>throws</code>
* clause any subclasses of <code>Error</code> that might be thrown
* during the execution of the method but not caught, since these
* errors are abnormal conditions that should never occur.
*
* @author Frank Yellin
* @version %I%, %G%
* @see java.lang.ThreadDeath
* @since JDK1.0
এটি কোনও খারাপ অভ্যাস নয় যদি আপনার কোনও পদ্ধতি বাদে একেবারে ব্যতিক্রম বুদ্বুদ না পাওয়া যায়।
আপনি যদি সত্যিই ব্যতিক্রমটি পরিচালনা করতে না পারেন তবে এটি একটি খারাপ অভ্যাস। কেবল ধরা এবং পুনরায় নিক্ষেপ করা বা আরও খারাপ, পদ্ধতির স্বাক্ষরে "নিক্ষেপ" যুক্ত করা আরও ভাল, এটি রানটাইমএক্সেপশনে মুড়ে পুনরায় নিক্ষেপ করা।
Throwable
দৃষ্টান্ত পরিচালনা করার জন্য একেবারে বৈধ মামলা রয়েছে - যেমন কাস্টম ব্যতিক্রম লগিংয়ের জন্য।
থ্র্যাবেলে ক্যাচিং কখনও কখনও প্রয়োজনীয় হয় যদি আপনি লাইব্রেরি ব্যবহার করেন যা ত্রুটিগুলি বেশি উত্সাহের সাথে ফেলে দেয়, অন্যথায় আপনার গ্রন্থাগারটি আপনার অ্যাপ্লিকেশনটি মেরে ফেলতে পারে।
যাইহোক, এই পরিস্থিতিতে সমস্ত থ্রোবেবলের চেয়ে লাইব্রেরি দ্বারা ফেলে দেওয়া নির্দিষ্ট ত্রুটিগুলি নির্দিষ্ট করা ভাল।
এটি আপনার যুক্তি নির্ভর করে বা আপনার অপশন / সম্ভাবনার সাথে আরও সুনির্দিষ্ট হতে পারে। যদি কোনও নির্দিষ্ট ব্যতিক্রম থাকে যা আপনি সম্ভবত অর্থবহ উপায়ে প্রতিক্রিয়া জানাতে পারেন তবে আপনি প্রথমে এটি ধরতে পারেন এবং এটি করতে পারেন।
যদি সেখানে না থাকে এবং আপনি অবশ্যই নিশ্চিত হন যে সমস্ত ব্যতিক্রম এবং ত্রুটিগুলির জন্য আপনি একই কাজ করবেন (উদাহরণস্বরূপ একটি ত্রুটি-বার্তা দিয়ে প্রস্থান করুন), তবে নিক্ষেপযোগ্যটিকে ধরতে সমস্যা হয় না।
সাধারণত প্রথম কেস হোল্ড হয় এবং আপনি ছুঁড়ে ফেলতে পারবেন না। তবে এখনও এটি প্রচুর ক্ষেত্রে রয়েছে যেখানে এটি ধরা ভাল কাজ করে।
যদিও এটি একটি খুব খারাপ অনুশীলন হিসাবে বর্ণনা করা হয়েছে, আপনি কখনও কখনও বিরল ক্ষেত্রে এটি খুঁজে পেতে পারেন যা এটি কেবল কার্যকর নয় তবে বাধ্যতামূলক। এখানে দুটি উদাহরণ দেওয়া হল।
এমন একটি ওয়েব অ্যাপ্লিকেশন যেখানে আপনাকে অবশ্যই ব্যবহারকারীর কাছে একটি অর্থ পূর্ণ ত্রুটি পৃষ্ঠা প্রদর্শন করতে হবে। এই কোডটি নিশ্চিত হয়ে নিন যে এটি try/catch
আপনার সমস্ত অনুরোধ হ্যান্ডেলারের (সার্লেটস, স্ট্রুট ক্রিয়াকলাপ বা কোনও নিয়ামক ....) এর চারপাশে বড় is
try{
//run the code which handles user request.
}catch(Throwable ex){
LOG.error("Exception was thrown: {}", ex);
//redirect request to a error page.
}
}
অন্য উদাহরণ হিসাবে, বিবেচনা করুন আপনার একটি পরিষেবা শ্রেণি রয়েছে যা তহবিল স্থানান্তর ব্যবসায় পরিবেশন করে। এই পদ্ধতিটি TransferReceipt
স্থানান্তর সম্পন্ন হলে বা NULL
এটি না পারলে একটি প্রদান করে।
String FoundtransferService.doTransfer( fundtransferVO);
এখন ইমেজিং আপনি List
ব্যবহারকারীর কাছ থেকে একাধিক তহবিল স্থানান্তর পাবেন এবং সেগুলি করতে আপনাকে অবশ্যই উপরের পরিষেবাটি ব্যবহার করতে হবে।
for(FundTransferVO fundTransferVO : fundTransferVOList){
FoundtransferService.doTransfer( foundtransferVO);
}
তবে কোনও ব্যতিক্রম ঘটলে কী হবে? আপনার থামানো উচিত নয়, যেহেতু একটি স্থানান্তর সাফল্য পেয়েছে এবং অন্যটি হতে পারে না, আপনার সমস্ত ব্যবহারকারীর মাধ্যমে চালিয়ে যাওয়া উচিত List
এবং প্রতিটি স্থানান্তরকে ফলাফল প্রদর্শন করা উচিত। সুতরাং আপনি এই কোড দিয়ে শেষ।
for(FundTransferVO fundTransferVO : fundTransferVOList){
FoundtransferService.doTransfer( foundtransferVO);
}catch(Throwable ex){
LOG.error("The transfer for {} failed due the error {}", foundtransferVO, ex);
}
}
throwable
সত্যিই ক্যাশেড এবং পরিচালনা করা হয়েছে তা দেখতে আপনি প্রচুর ওপেন সোর্স প্রকল্পগুলি ব্রাউজ করতে পারেন । উদাহরণস্বরূপ এখানে একটি অনুসন্ধান tomcat
, struts2
এবং primefaces
:
https://github.com/apache/tomcat/search?utf8=%E2%9C%93&q=catch%28Trrowable https://github.com/apache/struts/search?utf8=%E2%9C%93&q=catch % 28 দ্রোণযোগ্য https://github.com/primefaces/primefaces/search?utf8=%E2%9C%93&q=catch%28Trrowable
throwable
প্রশ্নটি কিছুটা অস্পষ্ট; আপনি জিজ্ঞাসা করছেন "এটি ধরা ঠিক কি Throwable
", বা "কিছু ধরা Throwable
এবং কিছু করা ঠিক নয়"? এখানে অনেক লোক উত্তরটির উত্তর দিয়েছিল, তবে এটি একটি পক্ষের বিষয়; সময় 99% না করা উচিত "গ্রাস" বা ব্যতিক্রম বাতিল হবে, আপনি আকর্ষণীয় হবে কিনা তা Throwable
বা IOException
বা যাই হোক না কেন।
আপনি যদি ব্যতিক্রমটি প্রচার করেন তবে উত্তর (অনেক প্রশ্নের উত্তরের মতো) "এটি নির্ভর করে"। আপনি ব্যতিক্রম নিয়ে কী করছেন on আপনি কেন এটি ধরছেন তা নির্ভর করে।
আপনি কেন ধরতে চান তার একটি ভাল উদাহরণ Throwable
হ'ল যদি কোনও ত্রুটি দেখা দেয় তবে কোনও ধরণের ক্লিনআপ সরবরাহ করা। উদাহরণস্বরূপ জেডিবিসি-তে, কোনও লেনদেনের সময় যদি কোনও ত্রুটি দেখা দেয় তবে আপনি লেনদেনটি আবার রোল করতে চান:
try {
…
} catch(final Throwable throwable) {
connection.rollback();
throw throwable;
}
মনে রাখবেন যে ব্যতিক্রমটি বাতিল করা হয়নি, তবে প্রচারিত হয়েছে।
তবে একটি সাধারণ নীতি হিসাবে ধরা, Throwable
কারণ আপনার কোনও কারণ নেই এবং কোন নির্দিষ্ট ব্যতিক্রমগুলি ছুঁড়ে দেওয়া হচ্ছে তা দেখতে খুব অলসতা হ'ল দুর্বল রূপ এবং একটি খারাপ ধারণা।
সাধারণভাবে বলতে গেলে আপনি এটি ধরা এড়াতে চান Error
তবে আমি (কমপক্ষে) দুটি সুনির্দিষ্ট ক্ষেত্রে যেখানে এটি করা উপযুক্ত তা ভাবতে পারি:
AssertionError
যা অন্যথায় নিরীহ।যদি আমরা ব্যবহার নিক্ষেপযোগ্য , তাহলে এটি জুড়ে ত্রুটি পাশাপাশি এবং যে এটি।
উদাহরণ।
public class ExceptionTest {
/**
* @param args
*/
public static void m1() {
int i = 10;
int j = 0;
try {
int k = i / j;
System.out.println(k);
} catch (Throwable th) {
th.printStackTrace();
}
}
public static void main(String[] args) {
m1();
}
}
আউটপুট:
java.lang.ArithmeticException: / by zero
at com.infy.test.ExceptionTest.m1(ExceptionTest.java:12)
at com.infy.test.ExceptionTest.main(ExceptionTest.java:25)
থ্রোয়েবল হ'ল সমস্ত ত্রুটি এবং অতিক্রমের সুপারক্লাস। আপনি যদি ক্যাচ ক্লজে থ্রোয়েবল ব্যবহার করেন তবে এটি কেবল সমস্ত ব্যতিক্রমই ধরা দেবে না, এটি সমস্ত ত্রুটিও ধরবে। ত্রুটিগুলি JVM দ্বারা মারাত্মক সমস্যাগুলি ইঙ্গিত করার জন্য নিক্ষেপ করা হয় যা কোনও অ্যাপ্লিকেশন দ্বারা পরিচালিত করার উদ্দেশ্যে নয়। এর জন্য সাধারণ উদাহরণগুলি হ'ল আউটআফমিউরিওর বা স্ট্যাকওভারফ্লো এরির। উভয়ই এমন পরিস্থিতির কারণে হয় যা অ্যাপ্লিকেশনের নিয়ন্ত্রণের বাইরে থাকে এবং পরিচালনা করা যায় না। সুতরাং আপনার থ্রোবেবলগুলি ধরা উচিত নয় যতক্ষণ না আপনার দৃ pretty় আত্মবিশ্বাস হয় যে এটি কেবল থ্রোয়েবলের অভ্যন্তরেই ব্যতিক্রম।
থ্রোয়েবলকে ধরার পক্ষে এটি সাধারণত খারাপ অভ্যাস হলেও (এই প্রশ্নটির অসংখ্য উত্তর দ্বারা বর্ণিত হিসাবে), যেখানে ধরা Throwable
কার্যকর হয় সে দৃশ্যগুলি বেশ সাধারণ common সরলকরণের উদাহরণ সহ আমি আমার কাজের সময়ে ব্যবহার করি এমন একটি মামলার ব্যাখ্যা করি।
এমন একটি পদ্ধতি বিবেচনা করুন যা দুটি সংখ্যার সংযোজন সম্পাদন করে এবং সফল সংযোজনের পরে এটি নির্দিষ্ট লোকেদের জন্য একটি ইমেল সতর্কতা প্রেরণ করে। ধরে নিন যে প্রত্যাবর্তিত নম্বরটি গুরুত্বপূর্ণ এবং কলিং পদ্ধতি দ্বারা ব্যবহৃত।
public Integer addNumbers(Integer a, Integer b) {
Integer c = a + b; //This will throw a NullPointerException if either
//a or b are set to a null value by the
//calling method
successfulAdditionAlert(c);
return c;
}
private void successfulAdditionAlert(Integer c) {
try {
//Code here to read configurations and send email alerts.
} catch (Throwable e) {
//Code to log any exception that occurs during email dispatch
}
}
ইমেল সতর্কতা প্রেরণের কোডটি প্রচুর সিস্টেম কনফিগারেশন পড়ে এবং তাই কোডের সেই ব্লক থেকে নানারকম ব্যতিক্রম হতে পারে। আমরা কলার পদ্ধতিতে প্রচার করার জন্য সতর্কতা প্রেরণের সময় কোনও ব্যতিক্রমের মুখোমুখি হতে চাই না, কারণ সেই পদ্ধতিটি এটি সরবরাহ করে এমন দুটি পূর্ণসংখ্যার মানগুলির যোগফলের সাথে সম্পর্কিত। সুতরাং, ইমেল সতর্কতা প্রেরণের কোডটি একটি try-catch
ব্লকে স্থাপন করা হয় , যেখানে Throwable
ধরা পড়ে এবং কোনও ব্যতিক্রম কেবল লগ হয়, যাতে বাকী প্রবাহ অব্যাহত রাখে।
Exception
সমস্ত উপায়ে এস ধরুন , তবে তা নয় Throwable
।