কারণ ভাষার স্পেসিফিকেশন System.Exception
সেখানে প্রকারের একটি অভিব্যক্তি প্রত্যাশা করে (অতএব, null
সেই প্রসঙ্গে একটি বৈধ) এবং এই অভিব্যক্তিটি শূণ্য হতে সীমাবদ্ধ করে না। সাধারণভাবে, এই অভিব্যক্তির মান কিনা তা সনাক্ত করার কোনও উপায় null
নেই। এটি থামার সমস্যাটি সমাধান করতে হবে। রানটাইমটিকে null
যাইহোক মামলা মোকাবেলা করতে হবে । দেখা:
Exception ex = null;
if (conditionThatDependsOnSomeInput)
ex = new Exception();
throw ex;
তারা অবশ্যই null
আক্ষরিক নিক্ষেপ করার সুনির্দিষ্ট কেসটিকে অকার্যকর করে তুলতে পারত তবে এতে তেমন কোনও উপকার হবে না, সুতরাং স্পেসিফিকেশন স্পেসটি কেন অপচয় করবে এবং সামান্য উপকারের জন্য ধারাবাহিকতা হ্রাস করবে?
দাবি অস্বীকার (এরিক লিপার্টের হাতে আমি চড় মারার আগে): এই নকশার সিদ্ধান্তের পিছনে যুক্তি সম্পর্কে এটি আমার নিজস্ব জল্পনা। অবশ্যই আমি ডিজাইনের বৈঠকে যাইনি;)
আপনার দ্বিতীয় প্রশ্নের উত্তর, একটি ক্যাচ ক্লজের মধ্যে থাকা এক্সপ্রেশন ভেরিয়েবলটি কখনই নালার হতে পারে: যদিও অন্যান্য # ভাষা null
ব্যতিক্রম প্রচার করতে পারে কিনা তা নিয়ে সি # স্পেসিফিকেশন নীরব, যদিও এটি ব্যতিক্রম প্রচারের উপায়টিকে সংজ্ঞায়িত করে:
ব্যতিক্রমগুলির জন্য উপযুক্ত হ্যান্ডলারটি সনাক্ত করার জন্য ক্যাচ ক্লজগুলি, যদি কোনও হয় তবে উপস্থিতি অনুসারে পরীক্ষা করা হয়। ব্যতিক্রমের ধরণের বা ব্যতিক্রমের বেসের প্রকারটিকে নির্দিষ্ট করে এমন প্রথম ক্যাচটিকে ম্যাচ হিসাবে বিবেচনা করা হয়। একটি সাধারণ ক্যাচ ক্লজটি কোনও ব্যতিক্রম ধরণের জন্য একটি ম্যাচ হিসাবে বিবেচিত হয়। [...]
কারণ null
, সাহসী বক্তব্যটি মিথ্যা। সুতরাং, সি # স্পিকার যা বলেছে তার ভিত্তিতে, আমরা বলতে পারি না যে অন্তর্নিহিত রানটাইমটি কখনই নালু ফেলবে না, আমরা নিশ্চিত হতে পারি যে এটি এমনকি যদি হয় তবে এটি কেবল জেনেরিক catch {}
ধারা দ্বারা পরিচালিত হবে ।
সিএলআই-তে সি # বাস্তবায়নের জন্য, আমরা ইসিএমএ 335 উল্লেখ করতে পারি। এই দস্তাবেজটি সমস্ত ব্যতিক্রম সংজ্ঞায়িত করে যে সিএলআই অভ্যন্তরীণভাবে ছুঁড়ে ফেলে (যার মধ্যে কোনওটিই নয় null
) এবং উল্লেখ করেছে যে ব্যবহারকারীর দ্বারা সংজ্ঞায়িত ব্যতিক্রম বস্তুগুলি throw
নির্দেশের দ্বারা ছোঁড়া হয়েছে । সেই নির্দেশের বিবরণটি সি # throw
স্টেটমেন্টের সাথে কার্যত অভিন্ন (ব্যতীত এটি বস্তুর প্রকারকে সীমাবদ্ধ করে না System.Exception
):
বর্ণনা:
throw
নির্দেশ ব্যতিক্রম বস্তু (টাইপ ছোঁড়ার O
স্ট্যাক) এবং স্ট্যাকের বের করে দেয়। ব্যতিক্রম প্রক্রিয়াটির বিশদগুলির জন্য, পার্টিশন I দেখুন
[ শেষ নোট]
ব্যতিক্রম:
System.NullReferenceException
যদি obj
হয় তবে ফেলে দেওয়া হয় null
।
সঠিকতা:
সঠিক সিআইএল নিশ্চিত করে যে বস্তুটি সর্বদা হয় null
বা কোনও বস্তুর রেফারেন্স (যেমন, টাইপের O
)।
আমি বিশ্বাস করি যে ধরা ব্যতিক্রমগুলি কখনই নয় এই সিদ্ধান্তে যথেষ্ট null
।