ব্যতিক্রম প্রচার: কখন আমার ব্যতিক্রম ধরা উচিত?


44

মেথোডা একটি মেথডবি কল করে যা ঘুরে মেথোডিসি বলে।

মেথডবি বা মেথডিসিতে কোনও ব্যতিক্রম হ্যান্ডলিং নেই। তবে মেথডো-তে ব্যতিক্রম হ্যান্ডলিং রয়েছে।

মেথডিসিতে একটি ব্যতিক্রম ঘটে।

এখন, এই ব্যতিক্রমটি মেথোডা পর্যন্ত বুদবুদ হচ্ছে, যা এটি যথাযথভাবে পরিচালনা করে।

এই সমস্যাটা কী?

আমার মনে, কোনও মুহুর্তে একজন কলকারী মেথডবি বা মেথডিসি কার্যকর করবেন এবং যখন এই পদ্ধতিগুলিতে ব্যতিক্রম ঘটে তখন সেই পদ্ধতির অভ্যন্তরে ব্যতিক্রমগুলি পরিচালনা করা থেকে কী লাভ হবে, যা মূলত কেবল চেষ্টা করার পরিবর্তে কেবল চেষ্টা / ধরা / অবশেষে অবরুদ্ধ তাদের কলি বুদবুদ?

ব্যতিক্রম হ্যান্ডলিংয়ের আশেপাশে বিবৃতি বা ক্যমত্য হ'ল যখন কেবলমাত্র তার কারণে মৃত্যুদন্ড কার্যকর করা যায় না - একটি ব্যতিক্রম। আমি তা পেয়েছি তবে কেন ব্যতিক্রমটিকে আরও পুরো পথে থামানোর চেষ্টা / ধরার পরিবর্তে শৃঙ্খলে উপস্থাপন করবেন না।

আপনার যখন সংস্থানগুলি মুক্ত করার দরকার হবে তখন আমি তা বুঝতে পারি। এটি সম্পূর্ণ আলাদা বিষয়।


46
আপনি কেন মনে করেন conক্যমত্যকে ক্যাচ দিয়ে যাওয়ার একটি শৃঙ্খলা আছে?
কালেথ

একটি ভাল আইডিই এবং সঠিক কোডিং শৈলীর সাহায্যে আপনি জানতে পারবেন যে কোনও পদ্ধতি বলা হলে কিছু ব্যতিক্রম ছোঁড়া যায়। হ্যান্ডেল করুন বা প্রচারের অনুমতি দিন হ'ল কলারের সিদ্ধান্ত। আমি এ নিয়ে কোনও সমস্যা দেখছি না।
হাইউ লে

14
যদি কোনও পদ্ধতি ব্যতিক্রমটি পরিচালনা করতে না পারে এবং কেবল এটি পুনর্বিবেচনা করে থাকে তবে আমি বলব এটি একটি কোড গন্ধ। যদি কোনও পদ্ধতি ব্যতিক্রমটি পরিচালনা করতে না পারে এবং ব্যতিক্রম ছুঁড়ে দেওয়া হয় তখন আর কিছু করার প্রয়োজন হয় না তবে try-catchব্লকের কোনও প্রয়োজন নেই ।
গ্রেগ বার্গার্ড্ট

7
"এই সমস্যাটা কী ?" : কিছুই নেই
ইওয়ান

5
পাস-থ্রু ক্যাচিং (এটি বিভিন্ন ধরণের বা তার মতো কিছুতে ব্যতিক্রম लपेटায় না) ব্যতিক্রমগুলির পুরো উদ্দেশ্যকে পরাস্ত করে। ব্যতিক্রম নিক্ষেপ একটি জটিল প্রক্রিয়া, এবং এটি ইচ্ছাকৃতভাবে নির্মিত হয়েছিল। যদি পাস-থ্রো ক্যাচগুলি উদ্দেশ্যমূলক ব্যবহারের কেস হত তবে আপনার প্রয়োজন কেবল একটি Result<T>প্রকার (এমন একটি প্রকার যা কোনও গণনার ফলাফল বা কোনও ত্রুটির সংরক্ষণ করে) বাস্তবায়ন করে আপনার অন্যথায় ছুঁড়ে ফাংশন থেকে ফিরিয়ে দেয়। স্ট্যাক আপ একটি ত্রুটি প্রচার প্রতিটি রিটার্ন মান পড়া, এটি একটি ত্রুটি কিনা তা পরীক্ষা করা, এবং যদি তা ত্রুটি ফিরে আসে জড়িত।
আলেকজান্ডার

উত্তর:


139

একটি সাধারণ নীতি হিসাবে, ব্যতিক্রমগুলি ধরবেন না যতক্ষণ না আপনি তাদের সাথে কী করবেন তা জানেন না। যদি মেথডিসি ব্যতিক্রম ছুঁড়ে ফেলে তবে মেথডবির এটি পরিচালনা করার কোনও কার্যকর উপায় নেই, তবে এটি ব্যতিক্রমটি মেথোডা পর্যন্ত প্রচারের অনুমতি দেওয়া উচিত।

কোনও পদ্ধতির ক্যাচ এবং রিথ্রো মেকানিজম থাকা উচিত তার একমাত্র কারণ:

  • আপনি একটি ব্যতিক্রমকে অন্যটিতে রূপান্তর করতে চান যা উপরের কলারের কাছে আরও অর্থবহ।
  • আপনি ব্যতিক্রমটিতে অতিরিক্ত তথ্য যুক্ত করতে চান।
  • সম্পদগুলি পরিষ্কার করতে আপনার একটি ক্যাচ ক্লজ দরকার যা কোনও ছাড়াই ফাঁস হবে।

অন্যথায়, ভুল স্তরে ব্যতিক্রম ধরা কলিং কোডের (এবং শেষ পর্যন্ত সফ্টওয়্যারটির ব্যবহারকারী) কোনও কার্যকর প্রতিক্রিয়া না দিয়ে চুপচাপ ব্যর্থ হয় এমন কোডের ফলাফল দেয়। একটি ব্যতিক্রম ধরা এবং তারপরে তাত্ক্ষণিকভাবে এটি পুনর্বিবেচনার বিকল্প অর্থহীন।


28
@ গ্রেগবার্গার্ট যদি আপনার ভাষার মতো কিছু থাকে try ... finally ...তবে তা ব্যবহার করুন, ধরুন এবং পুনর্নির্মাণ করবেন না
ক্যালাথ

19
"একটি ব্যতিক্রম ধরা এবং তারপরে অবিলম্বে এটি পুনর্বিবেচনা অর্থহীন" ভাষার উপর নির্ভর করে এবং আপনি কীভাবে এই বিষয়ে যান সেটি কোডবেসের জন্য সক্রিয়ভাবে ক্ষতিকারক হতে পারে। প্রায়শই লোকেরা এটির চেষ্টা করে যেমন মূল স্ট্যাকট্রেস ব্যতিক্রম সম্পর্কিত প্রচুর তথ্য সরিয়ে দেয়। আমি কোডটি মোকাবিলা করেছি যেখানে কলার একটি ব্যতিক্রম পায় যা কী ঘটেছিল এবং কোথায় হয়েছে তা পুরোপুরি বিভ্রান্তিকর।
জিমি জেমস

7
"ব্যতিক্রমগুলি ধরবেন না যদি না আপনি তাদের সাথে কী করতে চান তবে"। এটি প্রথম নজরে যুক্তিসঙ্গত মনে হলেও পরে সমস্যা তৈরি করে। আপনি এখানে যা করছেন তা আপনার কলকারীদের কাছে প্রয়োগের বিশদটি ফাঁস করছে। কল্পনা করুন যে আপনি ডেটা লোড করতে আপনার প্রয়োগে একটি নির্দিষ্ট ওআরএম ব্যবহার করছেন। আপনি যদি ওআরএমের সুনির্দিষ্ট ব্যতিক্রমগুলি না ধরেন তবে কেবল তাদের বুদবুদ করতে দিন, আপনি বিদ্যমান ব্যবহারকারীদের সাথে সামঞ্জস্যতা না ভেঙে আপনার ডেটা স্তরটি প্রতিস্থাপন করতে পারবেন না। এটি আরও সুস্পষ্ট ঘটনাগুলির মধ্যে একটি, তবে এটি বেশ कपटी হতে পারে এবং এটি ধরা শক্ত।
ভু

11
@Voo আপনার উদাহরণে আপনি কি জানেন এটা দিয়ে কি করতে হবে। এটিকে আপনার কোডের সাথে সুনির্দিষ্ট একটি ডকুমেন্টেড ব্যতিক্রমতে আবদ্ধ করুন, উদাহরণস্বরূপ LoadDataExceptionএবং আপনার ভাষার বৈশিষ্ট্য অনুসারে মূল ব্যতিক্রমের বিবরণ অন্তর্ভুক্ত করুন , যাতে ভবিষ্যতে রক্ষণাবেক্ষণকারীরা কোনও ডিবাগার সংযুক্ত না করে মূল কারণটি দেখতে সক্ষম হয় এবং কীভাবে সমস্যাটি পুনরুত্পাদন করতে পারে তা নির্ধারণ করতে পারে।
কলিন ইয়ং

14
@ ভো আপনার মনে হয়েছে "দৃশ্যপট প্রত্যাহার / পুনর্বিবেচনার কারণ হিসাবে আপনি" একটি ব্যতিক্রমটিকে অন্য একটিতে রূপান্তর করতে চান যা উপরোক্ত কলারের কাছে আরও অর্থপূর্ণ। "
jpmc26

21

এই সমস্যাটা কী ?

একেবারে কিছুই না.

এখন, এই ব্যতিক্রমটি মেথোডা পর্যন্ত বুদবুদ হচ্ছে, যা এটি যথাযথভাবে পরিচালনা করে।

"এটি যথাযথভাবে পরিচালনা করে" গুরুত্বপূর্ণ অংশ। এটি স্ট্রাকচার্ড এক্সসেপশন হ্যান্ডলিংয়ের ক্রুজ।

যদি আপনার কোড কোনও ব্যতিক্রম সহ কিছু "দরকারী" করতে পারে তবে এর জন্য যান। যদি না হয়, তবে ভাল একা দিন।

। । । সমস্ত উপায় অবরুদ্ধ করার চেষ্টা / ধরার পরিবর্তে কেন ব্যতিক্রমটিকে আরও চেইন পর্যন্ত ধরে না।

আপনার ঠিক তাই করা উচিত । যদি আপনি হ্যান্ডলার / পুনর্নবীকরণকারীদের "সমস্ত উপায়ে নিচে" থাকে এমন কোডটি পড়ছেন তবে আপনি [সম্ভবত] কিছু চমত্কার কোড পড়ছেন।

দুঃখের বিষয়, কিছু বিকাশকারীরা কেবল "বয়লার-প্লেট" কোড হিসাবে ধরা পড়েন যা তারা লেখার প্রতিটি পদ্ধতিতে ফেলেন (কোনও পাং উদ্দেশ্য নয়), প্রায়শই তারা সত্যিকারের ব্যতিক্রম হ্যান্ডলিংয়ের কারণ "না পেয়ে" এবং মনে করেন যে তাদের কিছু যুক্ত করতে হবে ব্যতিক্রমগুলি "পলায়ন" না করে এবং তাদের প্রোগ্রামটিকে হত্যা করে না।

এখানে অসুবিধার একটি অংশ হ'ল, বেশিরভাগ সময়, এই সমস্যাটি নজরেও আসবে না, কারণ ব্যতিক্রমগুলি পুরো সময় নিক্ষেপ করা হয় না তবে, যখন তারা থাকে , প্রোগ্রামটি একটি ভয়ঙ্কর সময় নষ্ট করে চলেছে এবং কোথাও পৌঁছানোর জন্য কল স্ট্যাকটি আস্তে আস্তে অনাবৃত করার প্রচেষ্টা যা ব্যতিক্রমের সাথে আসলে কার্যকর কিছু করে।


7
আরও খারাপটি হ'ল অ্যাপ্লিকেশনটি ব্যতিক্রমটি ধরলে এবং তারপরে এটি লগ করে (যেখানে আশা করা যায় যে এটি কেবল চিরতরে বসে থাকবে না) এবং যথারীতি যথাযথভাবে চালিয়ে যাওয়ার চেষ্টা করেও, যদিও এটি সত্যিই না পারে।
সলোমন উকো

1
@ সলোমনউকো: আচ্ছা, এটি নির্ভর করে। উদাহরণস্বরূপ আপনি যদি একটি সাধারণ আরপিসি সার্ভার লিখছেন, এবং একটি অবিবাহিত ব্যতিক্রমগুলি মূল ইভেন্ট লুপ পর্যন্ত সমস্ত পথে বুদবুদ হয়ে থাকে তবে আপনার একমাত্র যুক্তিসঙ্গত বিকল্প এটি লগ করা, রিমোট পিয়ারে আরপিসির ত্রুটি প্রেরণ এবং প্রক্রিয়াকরণ ইভেন্টগুলি পুনরায় শুরু করা। অন্য বিকল্পটি হ'ল পুরো প্রোগ্রামটি হানা, যা সার্ভারের উত্পাদনে মারা গেলে আপনার এসআরআই বাদামকে চালিত করবে।
কেভিন

@ কেভিন এই ক্ষেত্রে, catchসর্বোচ্চ স্তরে এমন একটিও হওয়া উচিত যা ত্রুটিটি লগ করে এবং ত্রুটির প্রতিক্রিয়া ফিরিয়ে দেয়। না catchব্লক সর্বত্র সিঁচিত। আপনি যদি প্রতিটি সম্ভাব্য পরীক্ষিত ব্যতিক্রম (জাভা ভাষায়) তালিকাভুক্ত করার মতো বোধ করেন না, তবে এটি RuntimeExceptionলগ ইন করার পরিবর্তে এটি চালিয়ে রাখুন, চালিয়ে যাওয়ার চেষ্টা করবেন এবং আরও ত্রুটি বা এমনকি দুর্বলতার দিকে চলে যান।
সলোমন উকো

8

আপনাকে গ্রন্থাগারসমূহ এবং অ্যাপ্লিকেশনগুলির মধ্যে পার্থক্য করতে হবে।

গ্রন্থাগারগুলি নির্বিঘ্নে ব্যতিক্রমগুলি অবাধে ফেলে দিতে পারে

আপনি যখন কোনও লাইব্রেরি ডিজাইন করেন, কোনও সময়ে আপনাকে কী ভুল হতে পারে তা নিয়ে ভাবতে হবে। পরামিতিগুলি ভুল পরিসরে থাকতে পারে বা null, বাহ্যিক সংস্থানগুলি উপলভ্য হতে পারে ইত্যাদি etc.

আপনার লাইব্রেরিতে প্রায়শই বুদ্ধিমান পদ্ধতিতে তাদের সাথে ডিল করার কোনও উপায় থাকবে না । একমাত্র বুদ্ধিমান সমাধান হ'ল একটি উপযুক্ত ব্যতিক্রম ছুঁড়ে ফেলা এবং অ্যাপ্লিকেশন বিকাশকারীকে এটির সাথে চুক্তি করা।

অ্যাপ্লিকেশনগুলির সর্বদা কিছু সময়ে ব্যতিক্রম ধরা উচিত

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

একটি মারাত্মক ত্রুটি একটি ত্রুটি যা প্রধান অ্যাপ্লিকেশন যুক্তি থেকে পুনরুদ্ধার করতে পারে না। উদাহরণস্বরূপ, যদি গ্রাফিক্স ডিভাইস ড্রাইভার কোনও ভিডিও গেমটিতে ক্র্যাশ হয়ে থাকে তবে অ্যাপ্লিকেশনটির পক্ষে "করুণার সাথে" ব্যবহারকারীকে জানানোর কোনও উপায় নেই। এই ক্ষেত্রে একটি লগ ফাইল লিখতে হবে এবং যদি সম্ভব হয় তবে ব্যবহারকারীকে কোনও না কোনও উপায়ে অবহিত করা উচিত।

এমনকি এইরকম গুরুতর ক্ষেত্রেও অ্যাপ্লিকেশনটির উচিত এই ব্যতিক্রমটিকে অর্থবহ উপায়ে পরিচালনা করা। এর মধ্যে একটি লগ ফাইল লেখা, ক্র্যাশ প্রতিবেদন প্রেরণ ইত্যাদি অন্তর্ভুক্ত থাকতে পারে the অ্যাপ্লিকেশনটির কোনওভাবে ব্যতিক্রমকে সাড়া না দেওয়ার কোনও কারণ নেই।


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

1
@ ভ্লাজ যা মারাত্মক বনাম অ-মারাত্মক তা অ্যাপ্লিকেশনটির সিদ্ধান্ত নিতে হয়। লাইব্রেরির উচিত কী হয়েছিল তা বলা উচিত। অ্যাপ্লিকেশনটিকে কীভাবে প্রতিক্রিয়া জানাবে তা সিদ্ধান্ত নিতে হবে।
MechMK1

0

আপনি যে প্যাটার্নটি বর্ণনা করেছেন তাতে কী ভুল তা হ'ল পদ্ধতি A এর তিনটি পরিস্থিতিতে পার্থক্য করার উপায় থাকবে না:

  1. পদ্ধতি বি প্রত্যাশিত ফ্যাশনে ব্যর্থ।

  2. পদ্ধতি সি পদ্ধতি বি দ্বারা অনুমানিত ফ্যাশনে ব্যর্থ হয়েছিল, তবে পদ্ধতি বি চলাকালীন একটি অপারেশন করছিল যা নিরাপদে পরিত্যক্ত হতে পারে।

  3. পদ্ধতি সি পদ্ধতি বি দ্বারা অনুমানিত ফ্যাশনে ব্যর্থ হয়েছিল, তবে পদ্ধতি বি যখন এমন একটি অপারেশন করছিল যা একটি অস্থায়ীভাবে অন্তর্ভুক্ত অবস্থায় থাকা জিনিসগুলিকে রেখেছিল যা সি এর ব্যর্থতার কারণে বি পরিষ্কার করতে ব্যর্থ হয়েছিল।

একমাত্র উপায় A এই পরিস্থিতিতেগুলির পার্থক্য করতে সক্ষম হবেন যদি বি থেকে নিক্ষিপ্ত ব্যতিক্রমটি সেই উদ্দেশ্যে পর্যাপ্ত তথ্য অন্তর্ভুক্ত করে, বা যদি পদ্ধতি B এর জন্য স্ট্রাক অযত্নযোগ্য স্ট্রোকটি একটি স্পষ্টত অবৈধ অবস্থায় রেখে দেয়। দুর্ভাগ্যক্রমে, বেশিরভাগ ব্যতিক্রম ফ্রেমওয়ার্কগুলি উভয় নিদর্শনকে বিশ্রী করে তোলে, প্রোগ্রামারদের "কম খারাপ" ডিজাইনের সিদ্ধান্ত নিতে বাধ্য করে।


2
পদ্ধতি 2 এবং 3 পদ্ধতি বি তে থাকা বাগগুলি পদ্ধতি পদ্ধতি A এগুলি ঠিক করার চেষ্টা করা উচিত নয়।
সোজয়ের্ড

@ সোজার্ড: পদ্ধতি বিতে যে পদ্ধতিতে সি ব্যর্থ হতে পারে তার সমস্ত উপায় কীভাবে অনুমান করা যায়?
সুপারক্যাট

সমস্ত অপারেশনগুলি সম্পাদন করার মতো সুপরিচিত প্যাটার্নগুলি দ্বারা যা টেম্প ভেরিয়েবলগুলিতে ফেলে দিতে পারে, তারপরে নিক্ষেপ করতে পারে না এমন ক্রিয়াকলাপগুলির সাথে - যেমন অদলবদল - নতুন রাষ্ট্রের সাথে পুরানো অদলবদল করে। অন্য একটি প্যাটার্ন অপারেশনগুলি সংজ্ঞায়িত করছে যা নিরাপদে পুনরাবৃত্তি হতে পারে, তাই আপনি গোলযোগের আশঙ্কা ছাড়াই অপারেশনটি আবার চেষ্টা করতে পারেন। 'ব্যতিক্রমী নিরাপদ কোড' লেখার বিষয়ে পুরো বই রয়েছে, তাই আমি আপনাকে এখানে সবকিছু বলতে পারি না।
Sjoerd

এটি ব্যতিক্রম মোটেও ব্যবহার না করার জন্য একটি ভাল পয়েন্ট (যা একটি দুর্দান্ত সিদ্ধান্ত ইমো হবে)। তবে আমার ধারণা, এটি সত্যই প্রশ্নের উত্তর দেয় না, কারণ ওপিকে প্রথমে ব্যতিক্রম ব্যবহার করার ইচ্ছা রয়েছে এবং কেবল কোথায় ধরা উচিত তা জিজ্ঞাসা করে ।
5:58

@ সোজারড পদ্ধতি বি যদি ভাষা দ্বারা ব্যতিক্রমগুলি নিষিদ্ধ করা হয় তবে তা যুক্তিযুক্ত হতে অনেক সহজ হয়ে যায়। কারণ সেক্ষেত্রে, আপনি আসলে বি এর মাধ্যমে সমস্ত নিয়ন্ত্রণ প্রবাহের পাথ দেখতে পাচ্ছেন এবং দৃশ্যপট এড়াতে কোন অপারেটরগুলি একটি নিক্ষেপ ফ্যাশন (সি ++) এ অতিরিক্ত চাপতে পারে তা আপনি দ্বিতীয়টি অনুমান করতে হবে না We আমরা কোডের দিক দিয়ে প্রচুর অর্থ প্রদান করছি ব্যতিক্রম ছোঁড়া "কেবল" দ্বারা ত্রুটি ফিরিয়ে দেওয়ার বিষয়ে অলস হওয়ার জন্য স্পষ্টতা এবং সুরক্ষা। কারণ, শেষ অবধি ত্রুটি পরিচালনা করা কোডের একটি অতীব গুরুত্বপূর্ণ অংশ।
5:30
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.