এরর হ্যান্ডলিং মোবাইল ডেভেলপারের জন্য একটি মৌলিক দক্ষতা। HackerOne (2025)-এর তথ্য অনুযায়ী, 62% ডেটা লঙ্ঘন অসংরক্ষিত এক্সেপশনের কারণে ঘটে। সঠিক এরর হ্যান্ডলিং শুধু ক্র্যাশ প্রতিরোধ করে না, ব্যবহারকারীর ডেটাও সুরক্ষিত রাখে। আসুন iOS, Android এবং React Native-এর পদ্ধতিগুলি দেখি।
মূল পয়েন্ট
এরর হ্যান্ডলিং Swift-এ চারটি মূল প্রক্রিয়ার উপর ভিত্তি করে: do-catch, throws, guard let এবং if-let। অনেক ভাষার বিপরীতে, Swift অসংরক্ষিত এক্সেপশনের অনুমতি দেয় না — প্রতিটি এরর স্পষ্টভাবে হ্যান্ডল করতে হবে বা throws-এর মাধ্যমে ঘোষণা করতে হবে। এরর হ্যান্ডলিং মোবাইল ডেভেলপমেন্টের জন্য একটি গুরুত্বপূর্ণ দক্ষতা, যা সরাসরি অ্যাপ্লিকেশনের স্থিতিশীলতাকে প্রভাবিত করে।
do-catch throws দিয়ে চিহ্নিত ফাংশন কল করার জন্য স্ট্যান্ডার্ড ব্লক। do-এর ভিতরে, try দিয়ে একটি ফাংশন কল করা হয়, এবং যদি এটি একটি এরর ফেলে, নিয়ন্ত্রণ catch-এ স্থানান্তরিত হয়। প্যাটার্ন ম্যাচিংয়ের মাধ্যমে বিভিন্ন এরর টাইপ হ্যান্ডল করা যায়। যদি কোনো এরর হ্যান্ডল না করা হয়, এটি স্ট্যাকের উপরে প্রচারিত হয় (Error Propagation)। iOS-এ কার্যকর এরর হ্যান্ডলিংয়ের জন্য, do-catch-কে প্রাথমিক প্রক্রিয়া হিসেবে ব্যবহার করুন।
Throw ফাংশন সিগনেচারে ঘোষণা করা হয়: func fetchData() throws -> Data। এর মানে হল কলিং কোডকে try, try? বা try!-এর মাধ্যমে এরর হ্যান্ডল করতে হবে। try? এররকে nil-এ রূপান্তর করে, try! এররে ক্র্যাশ ঘটায় (শুধু সাফল্য সম্পর্কে নিশ্চিত হলে ব্যবহার করুন)। Swift-এ throw-এর মাধ্যমে এরর হ্যান্ডলিং বাধ্যতামূলক অনুশীলন।
Guard let মান nil হলে ফাংশন থেকে তাড়াতাড়ি বের হওয়ার জন্য একটি নির্মাণ। if-let-এর বিপরীতে, guard let-এর else শাখায় একটি প্রস্থান (return, throw, break) প্রয়োজন। এটি কোডকে আরও সমতল এবং পঠনযোগ্য করে — নেস্টেড if ব্লক ছাড়া। যদি কোনো optional nil না হতে পারে — force unwrap (!) ব্যবহার করুন, শুধু যখন সম্পূর্ণ নিশ্চিত। মোবাইল অ্যাপে, guard let অপশনাল মান হ্যান্ডল করার সময় ক্র্যাশ এড়াতে সাহায্য করে।
Optional Chaining (user?.address?.city) এবং nil-coalescing (??) আনর্যাপ না করে অপশনাল নিয়ে কাজ করার জন্য সিনট্যাকটিক সুগার। IT Sectr-এ, আমরা API ইনপুট প্যারামিটার বৈধতা দেওয়ার জন্য guard let ব্যবহার করি এবং টিমকে স্পষ্ট মন্তব্য ছাড়া force unwrap এড়াতে বাধ্য করি। প্রতিটি স্তরে একটি এরর হ্যান্ডলার অপ্রত্যাশিত ব্যর্থতা থেকে রক্ষা করে।
Kotlin Android ডেভেলপমেন্টের জন্য প্রাথমিক ভাষা। এটি Java থেকে try-catch উত্তরাধিকার সূত্রে পায় তবে নিরাপদ বিকল্প যোগ করে: elvis অপারেটর, require, check এবং sealed class। Kotlin-এ এরর হ্যান্ডলিং এই প্রক্রিয়াগুলির সংমিশ্রণের উপর ভিত্তি করে। Swift-এর বিপরীতে, Kotlin-এ চেক করা এক্সেপশন হ্যান্ডল করার প্রয়োজন নেই (সব এক্সেপশন আনচেক)। Android-এ মোবাইল অ্যাপ্লিকেশনে এরর হ্যান্ডলিংয়ের জন্য, sealed class-কে প্রাথমিক প্যাটার্ন হিসেবে ব্যবহার করুন।
Try-catch Kotlin-এ একটি এক্সপ্রেশন হিসেবে কাজ করে — এটি একটি মান ফেরত দেয়। val result = try { fetchData() } catch (e: Exception) { fallbackValue }। এটি কোড সংক্ষিপ্ত করে। Elvis অপারেটর (?:) nullable টাইপের জন্য nil-coalescing-এর অনুরূপ: val name = user?.name ?: "Guest"। মোবাইল অ্যাপ্লিকেশনে এরর হ্যান্ডলিংয়ের জন্য, এক্সপ্রেশন হিসেবে try-catch সবচেয়ে সংক্ষিপ্ত পদ্ধতি।
Sealed class সাফল্য এবং এরর অবস্থা মডেলিংয়ের জন্য একটি শক্তিশালী টুল। sealed class NetworkResult { data class Success(val data: T) : NetworkResult(); data class Error(val message: String) : NetworkResult() }. when এক্সপ্রেশনে ব্যবহার করলে, কম্পাইলার শাখাগুলির সম্পূর্ণতা পরীক্ষা করে। sealed class-এর মাধ্যমে এরর হ্যান্ডলিং নিশ্চিত করে যে কোনো অবস্থা অসংরক্ষিত থাকে না।
// Sealed class + try-catch — Android-এর জন্য সাধারণ প্যাটার্ন
sealed class NetworkResult<out T> {
data class Success<out T>(val data: T) : NetworkResult<T>()
data class Error(val message: String) : NetworkResult<Nothing>()
}
fun fetchUser(id: String): NetworkResult<User> {
return try {
NetworkResult.Success(api.getUser(id))
} catch (e: Exception) {
NetworkResult.Error("Failed: ${e.message}")
}
}
উদাহরণে, sealed class NetworkResult দুটি অবস্থা মডেল করে: ডেটা সহ সাফল্য এবং বার্তা সহ এরর। fetchUser ফাংশন যেকোনো ক্ষেত্রে ফলাফল ফেরত দেয়, এবং কলিং কোড when-এর মাধ্যমে উভয় শাখা হ্যান্ডল করে। এটি অসংরক্ষিত এররের সম্ভাবনা দূর করে। sealed class-এর মাধ্যমে এরর হ্যান্ডলিং IT Sectr-এ Android ডেভেলপমেন্টের জন্য মানক।
Result একটি অন্তর্নির্মিত Kotlin টাইপ যা ব্যর্থ হতে পারে এমন একটি অপারেশনের ফলাফল উপস্থাপন করে। এটি fold, getOrThrow বা map-এর মাধ্যমে সাফল্য এবং ব্যর্থতা হ্যান্ডল করতে বাধ্য করে। Result অ্যাসিঙ্ক্রোনাস চেইন (coroutines) এ কার্যকর। Result-এর সাথে এরর হ্যান্ডলিং Kotlin-এ মোবাইল ডেভেলপমেন্টের জন্য একটি মানক।
Either Arrow লাইব্রেরি থেকে একটি ফাংশনাল টাইপ যা দুটি টাইপের একটির মান ফেরত দেওয়ার অনুমতি দেয় (Left — এরর, Right — সাফল্য)। Result-এর বিপরীতে, Either যে কোনো ব্যবহারকারী-সংজ্ঞায়িত এরর টাইপ ধারণ করতে পারে। সহজ প্রকল্পের জন্য, অন্তর্নির্মিত Result যথেষ্ট; জটিল প্রকল্পের জন্য, Arrow থেকে Either ব্যবহার করুন। এরর হ্যান্ডলিং টুলের পছন্দ প্রকল্পের জটিলতার উপর নির্ভর করে।
এরর প্রপাগেশন একটি প্রক্রিয়া যেখানে একটি এরর কল স্ট্যাকের উপরে প্রচারিত হয় যতক্ষণ না এটি হ্যান্ডল করা হয়। Kotlin-এ, এটি ডিফল্টরূপে ঘটে (আনচেক এক্সেপশন)। Swift-এ, এটি শুধু throws দিয়ে চিহ্নিত ফাংশনের ক্ষেত্রে প্রযোজ্য। Result এবং Either-এর সাথে, এরর প্রচারিত হয় না — তারা টাইপের মধ্যে থাকে এবং আপনাকে সেগুলি হ্যান্ডল করতে হবে। এটি মোবাইল অ্যাপ্লিকেশনে এরর হ্যান্ডলিংকে আরও নিরাপদ করে।
| প্যারামিটার | iOS (Swift) | Android (Kotlin) |
|---|---|---|
| মৌলিক প্রক্রিয়া | do-catch + throws | try-catch (expression) |
| Optional/Nullable | guard let, if-let, ?? | ?. let, elvis (?:) |
| ফাংশনাল পদ্ধতি | Result (Swift 5+) | Result, Either (Arrow) |
| এরর মডেলিং | Enum: Error | Sealed class |
| চেক করা এক্সেপশন | হ্যাঁ (throws) | না (সব আনচেক) |
| নন-ফ্যাটাল | os_log, Crashlytics | Timber, Crashlytics |
টেবিলটি মূল পার্থক্য দেখায়। iOS-এ স্পষ্ট এরর ঘোষণা (throws) প্রয়োজন, যা কোডকে নিরাপদ কিন্তু আরও শব্দবহুল করে। Android ডেভেলপার শৃঙ্খলার উপর নির্ভর করে। IT Sectr-এ, আমরা Android-এর জন্য sealed class এবং iOS-এর জন্য throws ব্যবহার করি — এটি মোবাইল অ্যাপ্লিকেশনে এরর হ্যান্ডলিংয়ের জন্য উভয় প্ল্যাটফর্মের সর্বোত্তম অনুশীলন।
ক্র্যাশ রিপোর্টিং অ্যাপ্লিকেশন ক্র্যাশ সংগ্রহ এবং বিশ্লেষণের একটি সিস্টেম। ক্র্যাশ রিপোর্টিং প্রোডাকশনে এরর হ্যান্ডলিংয়ের একটি অপরিহার্য অংশ। এটি ছাড়া, আপনি ব্যবহারকারীদের কাছ থেকে সমস্যা সম্পর্কে জানতে পারেন, যা প্রোডাকশনের জন্য অগ্রহণযোগ্য। দুটি প্রধান টুল: Firebase Crashlytics (বিনামূল্যে) এবং Sentry (মৌলিক ব্যবহারের জন্য বিনামূল্যে)। মোবাইল অ্যাপ্লিকেশনে এরর হ্যান্ডলিংয়ের জন্য, প্রথম রিলিজ থেকেই ক্র্যাশ রিপোর্টিং বাস্তবায়ন করুন।
Crashlytics Firebase-এর অংশ। এটি স্বয়ংক্রিয়ভাবে ক্র্যাশ সংগ্রহ করে, কল স্ট্যাক অনুসারে গ্রুপ করে এবং ক্ষতিগ্রস্ত ব্যবহারকারীর সংখ্যা দেখায়। এটি recordException()-এর মাধ্যমে নন-ফ্যাটাল এরর লগিং সমর্থন করে। ইন্টিগ্রেশন: build.gradle (Android) বা Podfile (iOS)-এ SDK যোগ করুন। Crashlytics প্রকল্প শুরু করার সময় এরর হ্যান্ডলিংয়ের জন্য সেরা বিনামূল্যের টুল।
Sentry একটি ক্রস-প্ল্যাটফর্ম এরর মনিটরিং সিস্টেম। Crashlytics-এর বিপরীতে, Sentry বিস্তারিত ট্রেসিং (breadcrumbs), পারফরম্যান্স মনিটরিং এবং React Native সমর্থন প্রদান করে। এটি এরর মুহূর্তে অ্যাপ্লিকেশনের অবস্থা দেখার অনুমতি দেয়। IT Sectr সেই প্রকল্পগুলির জন্য Sentry সুপারিশ করে যেগুলির মোবাইল ডেভেলপমেন্টে এরর হ্যান্ডলিংয়ের উপর সম্পূর্ণ নিয়ন্ত্রণ প্রয়োজন।
Error Boundary একটি React কম্পোনেন্ট যা চাইল্ড কম্পোনেন্ট ট্রিতে JavaScript এরর ধরে এবং একটি ফলব্যাক UI প্রদর্শন করে, সম্পূর্ণ অ্যাপ ক্র্যাশ প্রতিরোধ করে। Error Boundary React Native-এ এরর হ্যান্ডলিংয়ের জন্য একটি মূল কম্পোনেন্ট। গুরুত্বপূর্ণ স্ক্রিন এবং নেভিগেশনের জন্য error boundaries ব্যবহার করুন। React Native-এ মোবাইল অ্যাপ্লিকেশনে এরর হ্যান্ডলিংয়ের জন্য উপরের স্তরে সঠিক Error Boundary সেটআপ প্রয়োজন।
Error Boundary componentDidCatch(error, errorInfo) বা static getDerivedStateFromError(error)-এর মাধ্যমে তৈরি করা হয়। এটি অ্যাসিঙ্ক্রোনাস কোডে (setTimeout, requestAnimationFrame), সার্ভার-সাইড রেন্ডারিং বা নেটিভ এরর (Native Modules) ধরে না। লগিংয়ের জন্য, componentDidCatch-এর ভিতরে ক্র্যাশ রিপোর্টিং SDK ব্যবহার করুন। Error Boundary UI স্তরের জন্য একটি সহজ কিন্তু কার্যকর এরর হ্যান্ডলার।
ফ্যাটাল এরর একটি অসংরক্ষিত এক্সেপশন যা অ্যাপ্লিকেশন ক্র্যাশ ঘটায়। নন-ফ্যাটাল এরর একটি এক্সেপশন যা আপনি ধরেছেন এবং হ্যান্ডল করেছেন, কিন্তু এটি কোডে একটি সমস্যা নির্দেশ করে। নন-ফ্যাটাল এরর Crashlytics/Sentry-এর মাধ্যমে লগ করা হয় এবং ফ্যাটাল হওয়ার আগে বাগ খুঁজে পেতে সাহায্য করে। ফ্যাটাল এবং নন-ফ্যাটাল উভয় এররেরই মোবাইল ডেভেলপমেন্টে সঠিক এরর হ্যান্ডলিং প্রয়োজন।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
try-catch এক্সেপশনের জন্য একটি ভাষা প্রক্রিয়া। Result একটি র্যাপার টাইপ যা কম্পাইল সময়ে এরর হ্যান্ডলিং বাধ্য করে। IT Sectr-এ, আমরা বিজনেস লজিকের জন্য Result এবং বাহ্যিক সিস্টেমের সাথে কাজ করার জন্য try-catch পছন্দ করি। উভয় পদ্ধতি Kotlin-এ সাধারণ এরর হ্যান্ডলিংয়ের অংশ।
Error Boundary একটি React কম্পোনেন্ট যা চাইল্ড কম্পোনেন্ট ট্রিতে JavaScript এরর ধরে এবং সম্পূর্ণ অ্যাপ্লিকেশন ক্র্যাশ করার পরিবর্তে একটি ফলব্যাক UI প্রদর্শন করে। এটি অ্যাসিঙ্ক্রোনাস কোড বা সার্ভার-সাইড রেন্ডারিংয়ে এরর ধরে না। Error Boundary React Native-এ মোবাইল অ্যাপ্লিকেশনে এরর হ্যান্ডলিংয়ের একটি গুরুত্বপূর্ণ উপাদান।
Crashlytics (Firebase) শুরু করার জন্য সেরা পছন্দ: বিনামূল্যে, সহজ ইন্টিগ্রেশন, স্বয়ংক্রিয় ক্র্যাশ গ্রুপিং। Sentry সেই প্রকল্পগুলির জন্য যাদের বিস্তারিত এরর ট্রেসিং এবং পারফরম্যান্স মনিটরিং প্রয়োজন। এরর হ্যান্ডলিং টুলের পছন্দ বাজেট এবং মনিটরিং প্রয়োজনীয়তার উপর নির্ভর করে।
ফ্যাটাল এরর একটি অ্যাপ্লিকেশন ক্র্যাশ (অসংরক্ষিত এক্সেপশন)। নন-ফ্যাটাল এরর একটি এক্সেপশন যা আপনি ধরেছেন এবং হ্যান্ডল করেছেন, কিন্তু এটি কোডে একটি সমস্যা নির্দেশ করে। নন-ফ্যাটাল এরর আলাদাভাবে লগ করা হয় এবং ফ্যাটাল হওয়ার আগে বাগ খুঁজে পেতে সাহায্য করে। মোবাইল অ্যাপ্লিকেশনে এরর হ্যান্ডলিংয়ে উভয় প্রকারের মনিটরিং অন্তর্ভুক্ত করা উচিত।
guard let মান অনুপস্থিত থাকলে ফাংশন থেকে তাড়াতাড়ি বের হওয়ার জন্য ব্যবহার করা হয় — এটি কোডকে আরও রৈখিক এবং পঠনযোগ্য করে। if-let উপযুক্ত যখন একটি ব্লকের ভিতরে optional প্রয়োজন এবং ফাংশন থেকে বের হওয়ার প্রয়োজন নেই। guard let ইনপুট প্যারামিটার বৈধতা দেওয়ার জন্য পছন্দনীয় এবং iOS-এ এরর হ্যান্ডলিংয়ের অংশ।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।