ক্যাচ-ব্লক ব্যবহারের ভাল ব্যবহার?


15

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

আমি ব্যতিক্রম একজন অনুরাগী হিসাবে ত্রুটি কোডের ফেরার কারণ ত্রুটি কোড, উপেক্ষা করা যাবে বিস্মৃত ইত্যাদি যেহেতু একটি ব্যতিক্রম মূলত ঘাঁটা করা হয়েছে বিরোধিতা করছি (মঞ্জুর, আমি পারে ধরা ও অবিলম্বে উপর সরানো ...) আমি আমি এখনই যা যা করেছি তার চেয়ে আরও ভাল উপায় হতে পারে।

সম্পাদনা:  আমার এটিকে কিছুটা আলাদাভাবে বলা উচিত ছিল। আমি আবার বিভিন্ন ধরণের এবং এ জাতীয় হিসাবে নিক্ষেপ করতে বুঝতে পেরেছি, আমি এটি খারাপ বলেছি এবং এটি আমার নিজের দোষ। আমার প্রশ্ন হল ... এমনটি করার সময় কেউ কীভাবে সর্বোত্তমভাবে কোডটি পরিষ্কার রাখে? এটি কিছুক্ষণ পরে আমার কাছে অত্যন্ত বিশৃঙ্খলা অনুভব করতে শুরু করে।


কোন প্রোগ্রামিং ভাষা?
অপালালা

2
সি # এই মুহুর্তে, তবে আমি সাধারণভাবে চিন্তা করার চেষ্টা করছি।
3 '

সি # নিক্ষিপ্ত ব্যতিক্রমগুলির ঘোষণাকে জোর করে না, যা ব্যতিক্রমী যেখানেই এটির ব্যতিক্রমগুলি পরিচালনা করা সহজ করে তোলে এবং প্রোগ্রামাররা এগুলিকে পরিচালনা না করে তাদের ধরতে প্ররোচিত হতে পারে। সি # এর ডিজাইনার, আন্ডারস হেলজবার্গ এই নিবন্ধটিতে পরীক্ষিত ব্যতিক্রমগুলির বিরুদ্ধে মামলা করেছেন artima.com/intv/handcuffs.html
অপালালা

উত্তর:


14

, শক্তিশালী টাইপিং পরিপ্রেক্ষিতে চিন্তা এমনকি যদি আপনি একটি শক্তিশালী ভাবে টাইপ ভাষা ব্যবহার করছেন না - যদি আপনার পদ্ধতি না পারেন, টাইপ, এটি একটি ব্যতিক্রম নিক্ষেপ করা উচিত আপনি এটি প্রত্যাশিত ফিরে যান।

এছাড়াও, মডেলের (বা আরও খারাপ, UI) সমস্ত উপায়ে SQLException নিক্ষেপ করার পরিবর্তে প্রতিটি স্তরের পরিচিত ব্যতিক্রমগুলি ধরা উচিত এবং সেই স্তরটির সাথে উপযুক্ত ব্যতিক্রমগুলি মোড়ানো / মিউটেট / প্রতিস্থাপন করা উচিত:

Layer      Handles Exception
----------------------------
UI         DataNotFoundException
Model      DatabaseRetrievalException
DAO        SQLException

এটি প্রতিটি স্তরে আপনি যে ব্যতিক্রমগুলি সন্ধান করছেন তা সীমাবদ্ধ করতে এবং আপনাকে একটি সংগঠিত ব্যতিক্রম সিস্টেম বজায় রাখতে সহায়তা করবে।


আমি কয়েকটি সম্পাদনা করেছি, মূল প্রশ্নটি দুর্বলভাবে বানিয়েছি .. সমস্ত প্রশ্ন করা এবং ধরার সময় কীভাবে কোডটি পরিষ্কার রাখা যায় এবং কী করা যায় না সে সম্পর্কে আমার প্রশ্নটি আরও। যখন ব্লকগুলি সর্বত্র পাওয়া যায় তখন খুব অগোছালো
লাগতে শুরু করে

1
@ এডটি কি আপনার বিরক্ত করে না যে আপনার ইউআই বা মডেলটি "এসকিউএলএক্সসেপশন" ধরেছে? আমার কাছে, এটি খুব প্রাসঙ্গিক নয়। তাদের প্রত্যেকের কাছে আমার ধারণা।
নিকোল

1
@ এড, এটি যে ভাষাগুলিতে ব্যতিক্রমগুলি চেক করে নি সেগুলিতে এটি ঠিকঠাক হতে পারে তবে চেক করা ব্যাতিক্রমের ভাষাগুলিতে throws SQLExceptionএমন কোনও পদ্ধতি রয়েছে যা এসকিউএল এমনকি জড়িত তা বোঝায় না এটি সত্যই খারাপ । এবং যদি আপনি সিদ্ধান্ত নিয়ে থাকেন যে কিছু অপারেশন কোনও ফাইল স্টোরে যাওয়া উচিত? এখন আপনাকে ডিক্লেয়ার করতে হবে throws SQLException, IOException, ইত্যাদি ইত্যাদি হাতছাড়া হয়ে যাবে।
মাইক ড্যানিয়েলস

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

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

9

ব্যতিক্রমগুলি ক্লিনার কোড লেখার অনুমতি দেয় কারণ এর বেশিরভাগ অংশই স্বাভাবিক ক্ষেত্রে যত্ন নেয় এবং ব্যতিক্রমী কেসগুলি পরবর্তী সময়ে এমনকি কোনও ভিন্ন প্রসঙ্গেও পরিচালনা করা যায়।

ব্যতিক্রমগুলি হ্যান্ডলিং করার জন্য (ধরা) নিয়মটি হ'ল এটি অবশ্যই প্রসঙ্গ দ্বারা করা উচিত যা এটি সম্পর্কে আসলে কিছু করতে পারে। তবে এতে একটি নিষেধাজ্ঞা রয়েছে:

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

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


আমি সম্মত হয়েছি এবং আমার প্রশ্নটি সম্পাদন করে আমি যেখানে এটি খারাপভাবে লিখেছি তা প্রতিফলিত করতে। আমি বোঝাতে চাইছি কীভাবে চেষ্টা চালিয়ে যাওয়া এবং বিশৃঙ্খল জিনিসগুলি আপ থেকে আটকাতে হবে তা আরও প্রশ্ন।
31:51

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

1
এই জিনিসগুলি কোডের উদাহরণগুলির সাহায্যে বোঝা সহজ হবে ..
উপভোটে ক্লিক করুন

এটি সম্ভবত প্রথম থেকেই স্ট্যাকওভারফ্লোয়ের পক্ষে আরও উপযুক্ত একটি প্রশ্ন ছিল।
অপালালা

5

একটি সাধারণ নিয়ম হিসাবে আপনার কেবলমাত্র নির্দিষ্ট ব্যতিক্রমগুলি ধরা উচিত (যেমন IOException), এবং কেবলমাত্র আপনি যখন ব্যতিক্রমটি ধরেন তখন আপনার কিছু করার জন্য নির্দিষ্ট কিছু থাকে।

অন্যথায়, ব্যতিক্রমগুলি পৃষ্ঠের দিকে বুদ্বুদ হতে দেয়াই সর্বদা সর্বোত্তম যাতে তারা প্রকাশ পায় এবং তাদের সাথে ডিল করতে পারেন। কিছু লোক এই ব্যর্থটিকে দ্রুত বলে call

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

বিতরণকারী সিস্টেম জুড়ে আপনাকে ব্যতিক্রম ছোঁড়াতে হবে এবং ক্লায়েন্টের সার্ভার-সাইড ত্রুটির সংজ্ঞা না থাকলে রেপিং ব্যতিক্রমগুলি কার্যকর।


ব্যতিক্রম ধরা এবং চুপ করে যাওয়া করণীয় একটি ভয়ানক কাজ। প্রোগ্রামটি যদি ভাঙা হয় তবে এটি ব্যতিক্রম এবং একটি ট্রেসব্যাক সহ ক্রাশ হওয়া উচিত। এটি নিঃশব্দে জিনিসগুলি লগ ইন করার সাথে সাথে বিশৃঙ্খলা সৃষ্টি করতে হবে তবে ডেটা বিশৃঙ্খলা তৈরি করা উচিত।
এস .লট

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

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

@ নিউটোপিয়ান: "মোড়ানো" ব্যতিক্রম এবং "পুনর্লিখন" অ্যাবস্ট্রাকশনের ফুটো হ্রাস করে। তারা এখনও যথাযথভাবে বুদবুদ। "যদি আমার কী ধারণা আসে যে আমি কীভাবে আসছি আমি কীভাবে সম্ভবত প্রতিক্রিয়া জানাতে পারি! আমি নিজেকে প্রায়শই অনেক বেশি বিস্তৃত ক্যাচ নেট ব্যবহার করি বলে মনে করি" আপনি যে কাজটি থামিয়ে দেওয়ার পরামর্শ দিচ্ছেন সেটিই কি? আপনার সব কিছু ধরার দরকার নেই। 80% সময়, সঠিক জিনিসটি কিছু না ধরা। 20% সময় একটি অর্থবহ প্রতিক্রিয়া আছে।
এস.লট

1
@ নিউটোপিয়ান, আমি মনে করি আমাদের ব্যতিক্রমগুলির মধ্যে পার্থক্য করা দরকার যা সাধারণত কোনও বস্তু দ্বারা ছুঁড়ে ফেলা হয় এবং এইভাবে আবৃত করা উচিত, এবং ব্যতিক্রমগুলি যা বস্তুর কোডে বাগের কারণে উদ্ভূত হয় এবং মোড়ানো উচিত নয়।
উইনস্টন ইওয়ার্ট

4

কল্পনা করুন যে আপনি একটি স্ট্যাক ক্লাস লিখছেন। আপনি ক্লাসে কোনও ব্যতিক্রম হ্যান্ডলিং কোড রাখেন না, ফলস্বরূপ এটি নিম্নলিখিত ব্যতিক্রমগুলি উত্পাদন করতে পারে।

  1. অ্যারেআইএনডেক্সেরর - উত্থাপিত যখন ব্যবহারকারী খালি স্ট্যাক থেকে পপ করার চেষ্টা করে
  2. নালপ্রিটেক্সেপশন - একটি নাল রেফারেন্স রেফারেন্সের প্রয়াসের ফলে বাস্তবায়নের বাগের কারণে উত্থাপিত হয়েছিল

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

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

আমরা সত্যিই যা এড়াতে চাই তা হ'ল নিম্ন-স্তরের ব্যতিক্রমগুলি যা উচ্চ-স্তরের অবজেক্টগুলির মধ্য দিয়ে গেছে catch খালি স্ট্যাক থেকে পপ করার সময় একটি স্ট্যাক শ্রেণি যা একটি অ্যারেআইন্ডেক্সেরর ফেলে দেয় তা একটি ছোটখাটো সমস্যা। আপনি যদি সেই অ্যারেআইএনডেক্সেরর আসলেই ধরেন তবে আমাদের একটি গুরুতর সমস্যা আছে। নিম্ন-স্তরের ত্রুটিগুলির প্রচার তখন তাদেরকে ধরা খুব কম গুরুতর পাপ।

এটিকে আপনার SQLException- এর উদাহরণে ফিরিয়ে আনার জন্য: আপনি কেন এসকিএএলএক্সেপশন পাচ্ছেন? একটি কারণ হ'ল আপনি অবৈধ ক্যোয়ারী পেরিয়ে যাচ্ছেন। তবে, যদি আপনার ডেটা অ্যাক্সেস স্তরটি খারাপ অনুসন্ধান উত্পন্ন করে, এটি ভাঙা। ডেটা অ্যাক্সেসফেইলর ব্যতিক্রমতে এর ভাঙাটি পুনরায় মোছার চেষ্টা করা উচিত নয়।

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

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

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