উত্তর:
নির্মাণ
try { ... }
catch () { ... } /* You can even omit the () here */
try { ... }
catch (Exception e) { ... }
উভয়ই ব্লকের ভিতরে ছড়িয়ে থাকা প্রতিটি ব্যতিক্রমকে ধরে ফেলবে try
(এবং যদি আপনি ব্যতিক্রমগুলি লগ করতে কেবল এটি ব্যবহার না করেন তবে এড়ানো উচিত ) similar এখন এগুলি দেখুন:
try { ... }
catch ()
{
/* ... */
throw;
}
try { ... }
catch (Exception e)
{
/* ... */
throw;
}
try { ... }
catch (Exception e)
{
/* ... */
throw e;
}
প্রথম এবং দ্বিতীয় চেষ্টা-ধরার ব্লকগুলি হ'ল একই জিনিস, তারা কেবলমাত্র বর্তমান ব্যতিক্রমটি পুনর্বিবেচনা করে এবং সেই ব্যতিক্রমটি তার "উত্স" এবং স্ট্যাক ট্রেস রাখে।
তৃতীয় চেষ্টা-ধরার ব্লকটি আলাদা। এটি যখন ব্যতিক্রম ছুঁড়ে মারবে, এটি উত্স এবং স্ট্যাকের ট্রেসকে পরিবর্তন করবে, যাতে এটি প্রদর্শিত হবে যে ব্যতিক্রমটিকে এই পদ্ধতি থেকে ফেলে দেওয়া হয়েছে, throw e
সেই চেষ্টাটি-ব্লকযুক্ত পদ্ধতিতে সেই একই লাইন থেকে ।
কোনটি আপনার ব্যবহার করা উচিত? এটি প্রতিটি ক্ষেত্রে নির্ভর করে।
ধরা যাক আপনার Person
একটি .Save()
পদ্ধতি সহ একটি ক্লাস রয়েছে যা এটি একটি ডেটাবেজে স্থির থাকবে। ধরা যাক যে আপনার অ্যাপ্লিকেশনটি Person.Save()
কোথাও এই পদ্ধতিটি কার্যকর করে। যদি আপনার ডিবি ব্যক্তিটিকে বাঁচাতে অস্বীকৃতি জানায় তবে .Save()
তার ব্যতিক্রম হবে throw আপনি ব্যবহার করা উচিত throw
বা throw e
এই ক্ষেত্রে? ঠিক আছে, এটা নির্ভর করে।
আমি যা পছন্দ করি তা করা:
try {
/* ... */
person.Save();
}
catch(DBException e) {
throw new InvalidPersonException(
"The person has an invalid state and could not be saved!",
e);
}
এটি নতুন ব্যতিক্রম নিক্ষেপ হওয়ার "অভ্যন্তরীণ ব্যতিক্রম" হিসাবে DBException স্থাপন করা উচিত। সুতরাং আপনি যখন এই অবৈধপন্থী ধারণাটি পরিদর্শন করেন, স্ট্যাক ট্রেসটিতে সংরক্ষণের পদ্ধতিতে ফিরে তথ্য উপস্থিত থাকবে (এটি সমস্যার সমাধান করার জন্য আপনার পক্ষে যথেষ্ট হতে পারে), তবে আপনার যদি প্রয়োজন হয় তবে আপনার এখনও মূল ব্যতিক্রম অ্যাক্সেস থাকতে পারে।
চূড়ান্ত মন্তব্য হিসাবে, আপনি যখন কোনও ব্যতিক্রমের প্রত্যাশা করছেন , তখন আপনাকে অবশ্যই একটি নির্দিষ্ট ব্যতিক্রমটি ধরা উচিত, এবং সাধারণ নয় Exception
, অর্থাত্ যদি আপনি যদি কোনও অকার্যকরপার্সন আশা করেন তবে আপনার পছন্দ করা উচিত:
try { ... }
catch (InvalidPersonException e) { ... }
প্রতি
try { ... }
catch (Exception e) { ... }
শুভকামনা!
প্রথমটি স্ট্যাক ট্রেস সংরক্ষণ করে যখন দ্বিতীয়টি এটি পুনরায় সেট করে। এর অর্থ হ'ল আপনি যদি দ্বিতীয় পদ্ধতির ব্যবহার করেন তবে ব্যতিক্রমের স্ট্যাক ট্রেসটি সর্বদা এই পদ্ধতি থেকে শুরু হয়ে যাবে এবং আপনি ব্যতিক্রমী লগগুলি পড়ার জন্য যে ব্যতিক্রমী হতে পারে তার মূল ব্যতিক্রম চিহ্নটি হারাবেন কারণ তিনি কখনই ব্যতিক্রমের মূল কারণটি খুঁজে পাবেন না will ।
দ্বিতীয় পন্থাটি কার্যকর হতে পারে যখন আপনি স্ট্যাক ট্রেসগুলিতে অতিরিক্ত তথ্য যুক্ত করতে চান তবে এটি এটি ব্যবহার করা হয়:
try
{
// do something
}
catch (Exception ex)
{
throw new Exception("Additional information...", ex);
}
পার্থক্য নিয়ে আলোচনা করার জন্য একটি ব্লগ পোস্ট রয়েছে ।
throw
বনাম থেকে পৃথক throw e
।
আপনার ব্যবহার করা উচিত
try { }
catch(Exception e)
{ throw }
আপনি যদি পুনরায় নিক্ষেপ করার আগে ব্যতিক্রমটি দিয়ে কিছু করতে চান (উদাহরণস্বরূপ লগিং)। একাকী নিক্ষেপ স্ট্যাক ট্রেস সংরক্ষণ করে।
একটি প্যারামিটারলেস ক্যাচ এবং এ এর মধ্যে পার্থক্য catch(Exception e)
হ'ল আপনি ব্যতিক্রমের একটি রেফারেন্স পান। ফ্রেমওয়ার্ক সংস্করণ থেকে 2 পরিচালনা না করা ব্যতিক্রমগুলি একটি পরিচালিত ব্যতিক্রমগুলিতে আবৃত থাকে, সুতরাং প্যারামিটারলেস ব্যতিক্রম কোনও কিছুর জন্য কার্যকর হয় না।
throw;
এবং মধ্যে পার্থক্যthrow e;
হ'ল প্রথমটি ব্যতিক্রমগুলি পুনর্বিবেচনা করতে ব্যবহৃত হয় এবং দ্বিতীয়টি নতুনভাবে নির্মিত ব্যতিক্রম ছোঁড়াতে ব্যবহৃত হয়। আপনি যদি দ্বিতীয়টি ব্যতিক্রম পুনর্বিবেচনার জন্য ব্যবহার করেন তবে এটি এটি একটি নতুন ব্যতিক্রমের মতো আচরণ করবে এবং যেখানে স্ট্যাক তথ্যটি আছিল সেখানেই সেটিকে প্রতিস্থাপন করবে।
সুতরাং, আপনি প্রশ্নের বিকল্পগুলির কোনওটিই ব্যবহার করবেন না। আপনার প্যারামিটারলেস ক্যাচ ব্যবহার করা উচিত নয় এবং আপনার ব্যবহার করা উচিতthrow;
একটি ব্যতিক্রম পুনর্বিবেচনার জন্য করা ।
এছাড়াও, বেশিরভাগ ক্ষেত্রে আপনার সমস্ত ব্যতিক্রমের জন্য বেস শ্রেণীর চেয়ে আরও নির্দিষ্ট ব্যতিক্রম শ্রেণি ব্যবহার করা উচিত। আপনি যে ব্যতিক্রমগুলি প্রত্যাশা করেছেন কেবল সেগুলিই ধরা উচিত।
try {
...
} catch (IOException e) {
...
throw;
}
আপনি যদি ব্যতিক্রমটি পুনর্বিবেচনা করার সময় কোনও তথ্য যুক্ত করতে চান, আপনি সমস্ত তথ্য সংরক্ষণের জন্য অভ্যন্তরীণ ব্যতিক্রম হিসাবে মূল ব্যতিক্রম সহ একটি নতুন ব্যতিক্রম তৈরি করেন:
try {
...
} catch (IOException e) {
...
throw new ApplicationException("Some informative error message", e);
}