CoroutineExceptionHandler ব্যবহার করে Coroutine-এ এক্সেপশন এবং এরর নিরাপদে কীভাবে হ্যান্ডেল করবেন

  • launch এবং async কনস্ট্রাক্টরের মধ্যে ত্রুটি প্রচারের ক্ষেত্রে মৌলিক পার্থক্য।
  • CoroutineExceptionHandler এবং SupervisorJob ব্যবহার করে কো-রুটিন স্তরবিন্যাসের পতন রোধ করা হয়।
  • আরও শক্তিশালী কোডের জন্য Result এবং runCatching ব্যবহার করে কার্যকরী কৌশল প্রয়োগ করা।
  • ফ্লো এবং এক্সপোনেনশিয়াল ব্যাকঅফ সহ রিট্রাই স্ট্র্যাটেজির মাধ্যমে ডেটা ফ্লোতে ফল্ট ম্যানেজমেন্ট।

CoroutineExceptionHandler ব্যবহার করে Coroutine-এ এক্সেপশন এবং এরর নিরাপদে কীভাবে হ্যান্ডেল করবেন

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

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

ত্রুটি বিস্তার এবং কো-রুটিন বিল্ডার

কোটলিনে, কোনো সমস্যা হলে সব কো-রুটিন বিল্ডার একই রকম আচরণ করে না। একদিকে, আমাদের আছে লঞ্চ, যা ব্যতিক্রমগুলি প্রচার করে স্বয়ংক্রিয়ভাবে। যদি launch দিয়ে তৈরি কোনো কো-রুটিন একটি এরর থ্রো করে এবং সেটি হ্যান্ডেল করা না হয়, তবে এটিকে একটি আনক্যাচড এক্সেপশন হিসেবে গণ্য করা হয়, যা স্ট্যান্ডার্ড জাভা থ্রেড হ্যান্ডলারের ক্ষেত্রে যা ঘটে তার সাথে খুবই সাদৃশ্যপূর্ণ।

কোটলিন কোরাউটিন: launch, async এবং await-এ দক্ষতা অর্জন
সম্পর্কিত নিবন্ধ:
কোটলিন কোরাউটিনের সম্পূর্ণ নির্দেশিকা: launch, async, এবং await-এ দক্ষতা অর্জন

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

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

CoroutineExceptionHandler আয়ত্ত করা

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

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

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

স্বাধীন ত্রুটি পর্যবেক্ষণ এবং নিয়ন্ত্রণ

CoroutineExceptionHandler ব্যবহার করে Coroutine-এ এক্সেপশন এবং এরর নিরাপদে কীভাবে হ্যান্ডেল করবেন

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

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

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

ফাংশনাল অ্যাপ্রোচ: runCatching এবং Result ক্লাস

যদি আমরা নেস্টেড ট্রাই-ক্যাচ ব্লক ব্যবহার করতে করতে ক্লান্ত হয়ে পড়ি, তাহলে কোটলিন আরও অনেক বেশি মার্জিত একটি বিকল্প প্রদান করে: রানক্যাচিং ফাংশনএই টুলটি একটি কোড ব্লক এক্সিকিউট করে এবং এর ফলাফলকে একটি Result অবজেক্টে মোড়কজাত করে, যা একটি ভ্যালু সহ সাফল্য অথবা একটি এক্সেপশন সহ ব্যর্থতা প্রকাশ করতে পারে।

রেজাল্ট-এর জাদু এর এই ক্ষমতার মধ্যে নিহিত যে গঠন এবং রূপান্তরআমরা map, flatMap, বা recover-এর মতো ফাংশন ব্যবহার করে অপারেশনগুলোকে শৃঙ্খলিত করতে পারি। এটি আমাদেরকে ত্রুটি পরিচালনা থেকে ব্যবসায়িক যুক্তিকে আলাদা করতে সাহায্য করে, যার ফলে এমন একটি ডেটা প্রবাহ তৈরি হয় যেখানে ত্রুটিকে একটি মান হিসাবে গণ্য করা হয়। সিস্টেমের মধ্য দিয়ে প্রয়োজনের চেয়ে বেশি প্রবাহিত হয়।

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

ফ্লো এবং ওয়ার্কম্যানেজারে ত্রুটি ব্যবস্থাপনা

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

WorkManager-এর সাথে ব্যাকগ্রাউন্ড টাস্কের ক্ষেত্রে CoroutineWorker-এর ব্যবহারে বিশেষ মনোযোগের প্রয়োজন। যদি কোনো টাস্ক ব্যর্থ হয়, তবে আমরা সুস্পষ্টভাবে ফলাফলটি রিটার্ন না করা পর্যন্ত এটি স্বয়ংক্রিয়ভাবে পুনরায় চেষ্টা করা হবে না। Result.retry()কার্যকরী লজিককে একটি try-catch ব্লকের মধ্যে রেখে এই স্টেটটি রিটার্ন করাই একমাত্র উপায়। সিস্টেমটি যাতে কাজটি পুনরায় চেষ্টা করে তা নিশ্চিত করুন। কনফিগার করা নীতি অনুযায়ী।

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

একটি শক্তিশালী অ্যাপ্লিকেশন তৈরি করতে হলে কাঠামোগত কনকারেন্সির সাথে সুনির্দিষ্ট ফল্ট প্রোপাগেশন কন্ট্রোলের সমন্বয় করতে হয়। SupervisorJob এবং CoroutineExceptionHandler-এর বুদ্ধিদীপ্ত ব্যবহার অপ্রত্যাশিত ক্র্যাশ প্রতিরোধ করে, অন্যদিকে runCatching এবং Flow অপারেটরগুলো কোডে দৃশ্যমান ও ধারণাগত পরিচ্ছন্নতা নিয়ে আসে, যা ডেভেলপারদের ত্রুটি আগে থেকে অনুমান করতে এবং সেগুলোকে মসৃণ ও অনুমানযোগ্যভাবে সামলাতে সাহায্য করে।


অ্যান্ড্রয়েডের জন্য সার্ফশার্ক অ্যান্টিভাইরাস
এটা আপনার আগ্রহ হতে পারে:
অ্যান্ড্রয়েড থেকে ভাইরাস দূর করার উপায়: আপনার ফোন পরিষ্কার করার একটি সম্পূর্ণ ও হালনাগাদ নির্দেশিকা
Google-এ পছন্দের উৎস হিসেবে যোগ করুন