চেক করা ব্যতিক্রমগুলি কীভাবে মোকাবেলা করতে হবে যা কখনই ফেলে দেওয়া যায় না


35

উদাহরণ:

foobar = new InputStreamReader(p.getInputStream(), "ISO-8859-1");

যেহেতু এনকোডিংটি হার্ডকোডযুক্ত এবং সঠিক, তাই কনস্ট্রাক্টর স্পেসিফিকেশনটিতে ঘোষিত অসমর্থিত এনকোডিংএক্সেপশনটি কখনই ফেলে দেবে না (যদি জাভা বাস্তবায়ন না ভেঙে না যায়, তবে আমি যে কোনওভাবেই হারিয়েছি)। যাইহোক, জাভা আমাকে যাইহোক যাইহোক যে ব্যতিক্রমটি মোকাবেলা করতে বাধ্য করে।

বর্তমানে, এটির মতো দেখাচ্ছে

try {
    foobar = new InputStreamReader(p.getInputStream(), "ISO-8859-1");
}
catch(UnsupportedEncodingException e) { /* won't ever happen */ }

কোনও ধারণা কীভাবে এটি আরও ভাল করা যায়?


4
সত্যিকারের চ্যালেঞ্জের জন্য, এই ক্যাচটি আসলে কাজ করে তা নিশ্চিত করার জন্য একটি ইউনিট পরীক্ষা লিখুন।
জে এলস্টন

1
new নতুন ইম্পসিবলএক্সেপশন ("মহাবিশ্বকে রিবুট করুন mes
ক্রিস চডমোর

1
"কখনও ঘটবে না" হবে ...

থরবজার্ন রাভন অ্যান্ডারসন: এটি প্রোগ্রামটি পরিবর্তনের পরে হতে পারে, তবে কমপক্ষে বর্তমান অবস্থায় কোনও ইনপুট ডেটা ব্যতিক্রমকে ট্রিগার করতে পারে না।
ব্যবহারকারী 281377

উপরে আপনার নির্দিষ্ট উদাহরণে, একটি ব্যতিক্রম ছুঁড়ে দেওয়া হয়েছে কারণ পদ্ধতিটি এটি সমর্থিত কিনা বা সমর্থিত এনকোডিং সহ কল ​​হবে কিনা তা জানে না। এর আশেপাশের উপায় হ'ল যদি এমন আরও কোনও কন্সট্রাক্টর থাকতেন যা ধরে নিয়েছিলেন যে একটি স্ট্যান্ডার্ড চরসেট দেওয়া হয়েছিল, তবে এটির ব্যতিক্রম ছুঁড়ে দেওয়ার ঘোষণা দেওয়ার প্রয়োজন হবে না।
জর্দান

উত্তর:


27

আমার অভ্যাসটি হচ্ছে, কেবল নিরাপদ দিকে থাকা, assertক্যাচ ব্লকে প্রবেশ করা । কেউ হয়ত tryপরে ব্লকের বিষয়বস্তু পরিবর্তন করতে পারে এবং কোডটি আপনি ব্যর্থ না করে তা আপনি জানতে চান?


ভাল ধারণা; একটি সরল assert false;খুব বেশি বিশৃঙ্খলা যোগ করে না এবং এটি পরিষ্কার করে দেয় যে আমি ধরে নিয়েছি ক্যাচ ব্লকটি কখনই প্রবেশ করবে না।
ব্যবহারকারী 281377

5
@ammoQ, অথবা আপনি এমনকি করতে একটি বার্তা যোগ করতে পারেন আপনার অভিপ্রায় একেবারে পরিষ্কার: assert false : "should never happen"
প্যাটার টারিক

13
আরও ভাল, "জাভা এর চারসেট আইএসও -8859-1 সমর্থিত হওয়া দরকার কারণ কখনই ঘটবে না" "
dan04

3
assertইঙ্গিতগুলি সক্ষম হয়েছে। আমি একটি নিক্ষেপ করি UnexpectedException(যার ফলে আমাকে স্ট্যাক ট্রেস দেওয়ার সুবিধাও রয়েছে ...)।
চপ

35

যদি আমি লগ / ত্রুটি দেখে প্রতিবারের জন্য আমাকে একটি শতাংশ দেওয়া হত, "এটি কখনই ঘটবে না", আমার কাছে ... ভাল, দুটি সেন্ট হবে। কিন্তু এখনো...

খালি ক্যাচ ব্লকগুলি আমার মাকড়সা সংবেদনকে জটিল করে তোলে এবং বেশিরভাগ ভাল কোড বিশ্লেষক সরঞ্জাম অভিযোগ করে। এগুলি খালি রাখতে আমি কোনও খরচেই এড়াতে চাই। অবশ্যই, এখন আপনি জানেন যে ত্রুটিটি কখনই ঘটতে পারে না, তবে এক বছর পর থেকে কেউ "আইএসও -8859-1" এর একটি বিশ্বব্যাপী অনুসন্ধান-প্রতিস্থাপন করে এবং হঠাৎ আপনার বাগটি খুঁজে পাওয়া খুব কঠিন হতে পারে।

assert falseপরামর্শ ভাল, কিন্তু যেহেতু গবেষকেরা অক্ষম করা যেতে পারে রানটাইম, তারা কোন গ্যারান্টি আছে। আমি এর RuntimeExceptionপরিবর্তে ব্যবহার করব । এগুলি ক্লাসে কল করে ধরা পড়বে না এবং যদি সেগুলি ঘটে তবে পুরো তথ্য দেওয়ার জন্য আপনার স্ট্যাক ট্রেস থাকবে।


28

আমি সবসময় এটি এরকম করে ফেলেছি:

try {
    foobar = new InputStreamReader(p.getInputStream(), "ISO-8859-1");
} catch(UnsupportedEncodingException e) {
    throw new AssertionError(e);
}

কিছুটা ভার্বোজ হতে পারে (জাভা হল ...) তবে অসম্ভব ঘটলে কমপক্ষে আপনি দৃ as়তা ত্রুটি পাবেন।

যদি জাভা প্রয়োগটি ভেঙে যায়, আপনি কেবল অসম্ভবকে উপেক্ষা করার পরিবর্তে যত দ্রুত সম্ভব তত ভাল ত্রুটি বার্তা পেতে চাইবেন want এবং জাভা বাস্তবায়ন ভাঙা না থাকলেও, কেউ আপনার কোডটি "UTF8"(ওফ - এটি হওয়া উচিত ছিল "UTF-8") তে পরিবর্তন করতে পারে ।

এটি প্রথম স্থানে একটি রানটাইম ব্যতিক্রম হওয়া উচিত ছিল । জেডিকে এই ধরণের ভুল পছন্দে পূর্ণ।


4
আসল খারাপ ডিসিশন (বা আপনি চাইলে বাদ দিতে পারেন) হ'ল জাভা যে cha টি চার্সেটের প্রয়োজন তার কোনও পূর্বনির্ধারিত চরসেটের দৃষ্টান্ত নেই। foobar = new InputStreamReader(p.getInputStream(), Charset.ISO_8859_1);- এখন কি ভাল লাগবে না এবং একবার এবং চিরকালের জন্য কোনও ভুল এড়ানো হবে না?
ব্যবহারকারী 281377

3
পেয়ারা লাইব্রেরিতে এই প্রচুর জিনিস রয়েছে। জীবনকে সহজ করে তোলে।

3
জাভা 1.7+ এর চার্সেট কনস্ট্যান্টগুলি সংজ্ঞায়িত করা হয়েছে: ডকস.ওরাকল . com / javase / 7 / docs / api / java / nio/ charset/ । এগুলি তাদের মতো ব্যবহার করুন: স্ট্যান্ডার্ডচ্যারেটস.উইটিএফ_8.ডিসপ্লে নাম ()
মাইকেল 16

4

আপনি যদি একমাত্র বিকাশকারী যিনি এই কোডটি দেখতে পাচ্ছেন তবে আমি এটির জরিমানা বলব, তবে আপনি যদি না হন তবে আমি এটিকে বাস্তব সম্ভাবনা হিসাবে বিবেচনা করব বা কমপক্ষে "কখনও ঘটবে না" মন্তব্যটি পরিবর্তন করব আরও কিছু দরকারী।


4

এই ব্যতিক্রমগুলির অংশটি যা আমাকে সবচেয়ে বেশি বিরক্ত করে তা হ'ল এটি আমার কোড কভারেজটিতে ব্যথা করে।

যখন আমি কভারেজ সম্পর্কে বাধ্য হয়ে উঠছি, তখন আমি চেষ্টা করব / ধরব যে "কখনই ঘটতে পারে না" (... বা কেবলমাত্র যদি আমি কোনও মিউট্যান্ট জেভিএম ব্যবহার করি যা কোনওভাবে "ইউএস-এএসসিআইআই" অন্তর্ভুক্ত করতে ভুলে গেছে) এখানে বর্ণিত একটি পদ্ধতিতে (সাধারণত একটি স্নাইড বার্তা সহ একটি চেক করা ব্যতিক্রম নিক্ষেপ করা হয়) চেষ্টা করে / ধরার চেষ্টা করে এবং চেক করা ব্যতিক্রম প্রতিস্থাপন করে এমন একটি বর্গ এবং পদ্ধতি।

তারপরে আমার কোড কভারেজটি ইউটিলিটি ক্লাসে হিট লাগবে, কিন্তু আমার কোডের চারদিকে ছড়িয়ে ছিটিয়ে থাকা অপারেশনের সমস্ত উল্লেখে নয়।

কখনও কখনও আমি একটি ক্লাসে ক্রিয়াকলাপের মতো রোল আপ করতে সময় নেব যা প্রকৃতপক্ষে সহজাত শব্দার্থবিজ্ঞান রয়েছে। যেহেতু এটি আমার সতীর্থদের কাছে যা ঘটছে তা বেশ স্পষ্ট, তাই আমি সাধারণত এটি যতটা সহজ পারি ঠিক রাখি & সর্বোত্তম সম্ভাব্য নকশার বিষয়ে এত চিন্তা করি না।

তবে, একটি মন্তব্য হিসাবে উল্লেখ করা হয়েছে, পেয়ারা এবং অন্যান্য গ্রন্থাগারগুলির মধ্যে এই ব্যথা প্রশমিত করার উপায় রয়েছে - তবে এটি মূলত একই কৌশল। বিরক্তিকে অফ-স্টেজে সরান যাতে আপনার মূল কোডটি কভারেজটি হিট না করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.