Non-Fatal Error — এমন একটি ত্রুটি যা অ্যাপ্লিকেশনের কাজ শেষ করে না এবং প্রোগ্রাম নির্বাহ চালিয়ে যেতে দেয়। ফ্যাটাল ত্রুটির বিপরীতে, নন-ফ্যাটাল ত্রুটিগুলি ব্যবহারকারীর সেশন না হারিয়ে ধরা, পরিচালনা এবং লগ করা যেতে পারে। Firebase Crashlytics ডকুমেন্টেশন, 2024 অনুসারে, প্রোডাকশন অ্যাপ্লিকেশনে লগ করা সমস্ত ত্রুটির প্রায় 70% নন-ফ্যাটাল, কিন্তু সেগুলি উপেক্ষা করলে প্রযুক্তিগত ঋণ জমা হয় এবং ব্যবহারকারীর অভিজ্ঞতা ধীরে ধীরে খারাপ হয়। নন-ফ্যাটাল ত্রুটিগুলির সঠিক পরিচালনা মোবাইল ডেভেলপারের মূল দক্ষতাগুলির মধ্যে একটি।
মূল বিষয়
Non-Fatal Error — একটি ব্যতিক্রম বা ত্রুটির অবস্থা যা প্রক্রিয়া সমাপ্তির কারণ হয় না। অ্যাপ্লিকেশন কাজ চালিয়ে যায়, কিন্তু ভুল অবস্থায় থাকতে পারে: ডেটা লোড হয়নি, অনুরোধ পাঠানো হয়নি, ইন্টারফেস উপাদান প্রদর্শিত হয়নি। ব্যবহারকারী要么 ত্রুটিটি লক্ষ্য করেন না,要么 একটি বার্তা দেখেন এবং অ্যাপ্লিকেশন ব্যবহার চালিয়ে যান।
একটি নন-ফ্যাটাল ত্রুটি সর্বদা প্রোগ্রামকে পুনরুদ্ধারের পথ ছেড়ে দেয়। ত্রুটি হ্যান্ডলার বিকল্প ডেটা সরবরাহ করতে পারে, অপারেশন পুনরায় চেষ্টা করতে পারে বা ইন্টারফেস প্লেসহোল্ডার দেখাতে পারে। মূল লক্ষ্য ক্র্যাশ প্রতিরোধ করা এবং একটি গ্রহণযোগ্য ব্যবহারকারীর অভিজ্ঞতা বজায় রাখা। ডেভেলপারকে প্রতিটি catch ব্লকে স্পষ্টভাবে পুনরুদ্ধারের পরিস্থিতি পরিকল্পনা করতে হবে।
Instabug 2024 অনুসারে, 65% ব্যবহারকারী দুটি ব্যর্থ মিথস্ক্রিয়ার পরে অ্যাপ আনইনস্টল করে। অমনোযোগী রেখে দেওয়া নন-ফ্যাটাল ত্রুটিগুলি জমা হয় এবং সামগ্রিক গুণমান হ্রাস করে। নন-ফ্যাটাল ত্রুটিগুলির পদ্ধতিগত লগিং এবং সংশোধন ব্যবহারকারী ধারণক্ষমতা উন্নত করতে এবং অ্যাপ স্টোর রেটিং বাড়ানোর সরাসরি পথ।
নেটওয়ার্ক ত্রুটি মোবাইল অ্যাপ্লিকেশনে নন-ফ্যাটাল ত্রুটির সবচেয়ে সাধারণ প্রকার। সংযোগ টাইমআউট, নেটওয়ার্ক হারানো, ভুল সার্ভার স্ট্যাটাস কোড — এই সমস্ত পরিস্থিতি ক্র্যাশ ছাড়াই ধরা এবং পরিচালনা করা হয়। ব্যবহারকারীকে পুনরায় চেষ্টা করার বিকল্প সহ পরিষেবা অনুপলব্ধতার বার্তা দেখানো হয়। এক্সপোনেনশিয়াল ব্যাকঅফ সহ পুনরায় চেষ্টা প্যাটার্ন নেটওয়ার্ক ত্রুটির জন্য সাধারণ।
ভুল সার্ভার প্রতিক্রিয়া বিন্যাস, প্রয়োজনীয় ফিল্ডের অভাব, অবৈধ ডেটা টাইপ — পার্সিং ত্রুটি নন-ফ্যাটাল হয় যদি অ্যাপ্লিকেশন ভুল ডেটা সঠিকভাবে পরিচালনা করে। সাধারণ পদ্ধতি হল ডিফল্ট ফলব্যাক মান ব্যবহার করা এবং পরে সার্ভার-সাইড বিশ্লেষণের জন্য অনুরোধ প্রসঙ্গ সহ পার্সিং ত্রুটি লগ করা।
ছবি লোডিং সমস্যা, ভুল ফন্ট, লেআউট ত্রুটি — সবগুলি নন-ফ্যাটাল কিন্তু ব্যবহারকারীর অভিজ্ঞতা খারাপ করে। প্লেসহোল্ডার ছবি এবং ফলব্যাক মান খালি স্ক্রিন এড়াতে এবং ত্রুটিগুলি কম লক্ষণীয় করতে সাহায্য করে। React Native-এ, UI ত্রুটির জন্য ফলব্যাক উপাদান প্রদর্শন করে Error Boundary ব্যবহার করা হয়।
গণনার ত্রুটি, অবস্থার অমিল, ভুল স্ক্রিন ট্রানজিশন — লজিক ত্রুটি প্রায়ই ক্র্যাশের কারণ হয় না কিন্তু অ্যাপ্লিকেশনের ভুল আচরণের দিকে নিয়ে যায়। পদ্ধতিগত লগিং এবং মনিটরিং ছাড়া সেগুলি খুঁজে পাওয়া কঠিন কারণ তারা ক্র্যাশ রিপোর্ট তৈরি করে না এবং ব্যবহারকারীর অভিযোগ পর্যন্ত অলক্ষিত থাকে।
Non-Fatal Error ফ্যাটাল থেকে আলাদা কারণ এটি প্রোগ্রামকে কাজ চালিয়ে যাওয়ার সুযোগ ছেড়ে দেয়। ফ্যাটাল ত্রুটি এমন একটি অবস্থা যা থেকে অ্যাপ্লিকেশন পুনরুদ্ধার করতে পারে না: নাল পয়েন্টার ডিরেফারেন্স, স্ট্যাক ওভারফ্লো, মেমরি শেষ। একটি নন-ফ্যাটাল ত্রুটি ধরা, পরিচালনা এবং নির্বাহ চালিয়ে যাওয়া যেতে পারে, যেখানে ফ্যাটাল ত্রুটির জন্য অ্যাপ্লিকেশন পুনরায় চালু করা প্রয়োজন।
| বৈশিষ্ট্য | Non-Fatal Error | Fatal Error |
|---|---|---|
| অ্যাপ সমাপ্তি | না | হ্যাঁ |
| পুনরুদ্ধার সম্ভব | হ্যাঁ, catch ব্লকের মাধ্যমে | না |
| লগিং | recordException এর মাধ্যমে কোড থেকে | শুধুমাত্র ক্র্যাশ রিপোর্টার দ্বারা |
| UX-প্রভাব | অস্থায়ী অসুবিধা | সম্পূর্ণ সেশন ব্যর্থতা |
| উদাহরণ | নেটওয়ার্ক টাইমআউট, পার্স ত্রুটি | NullPointerException, OOM |
নন-ফ্যাটাল এবং ফ্যাটালের মধ্যে সীমানা বাস্তবায়নের উপর নির্ভর করতে পারে। একটি অ্যাপ্লিকেশনে নেটওয়ার্ক টাইমআউট নন-ফ্যাটাল হিসাবে পরিচালিত হয় (1–2 সেকেন্ড পরে পুনরায় চেষ্টা), অন্যটিতে এটি ফ্যাটাল হতে পারে (কোন হ্যান্ডলার না থাকলে ক্র্যাশ)। গুণগত ত্রুটি পরিচালনা সম্ভাব্য ফ্যাটাল পরিস্থিতিকে নন-ফ্যাটালে পরিণত করে, অ্যাপ্লিকেশন স্থিতিশীলতা বাড়ায়। উচ্চ নির্ভরযোগ্যতার প্রয়োজনীয়তা সহ মোবাইল অ্যাপ্লিকেশন বিকাশের সময় ত্রুটি পরিচালনা পদ্ধতি ডিজাইন করা মূল আর্কিটেকচারাল কাজগুলির মধ্যে একটি। একটি অন্তর্নির্মিত মনিটরিং সিস্টেম দলকে দ্রুত নন-ফ্যাটাল ত্রুটি সনাক্ত এবং ঠিক করতে দেয় সেগুলি উল্লেখযোগ্য সংখ্যক ব্যবহারকারীকে প্রভাবিত করার আগে।
Firebase Crashlytics মোবাইল অ্যাপ্লিকেশনে নন-ফ্যাটাল ত্রুটি লগ করার প্রধান টুল। recordException পদ্ধতি অ্যাপ্লিকেশন বাধা না দিয়ে সম্পূর্ণ স্ট্যাক ট্রেস এবং নির্বাহ প্রসঙ্গ সহ একটি নন-ফ্যাটাল ব্যতিক্রম ক্যাপচার করতে দেয়। ক্র্যাশ রিপোর্টের বিপরীতে, ক্যাচ করা ব্যতিক্রম লগ করতে কোডের যে কোনও জায়গায় recordException কল করা যেতে পারে।
fun fetchUserData(userId: String) {
try {
val response = apiService.getUser(userId)
updateUI(response)
} catch (e: IOException) {
Crashlytics.log("Network error for user $userId")
Crashlytics.recordException(e)
showRetryDialog()
} catch (e: JsonParseException) {
// Non-fatal: ফলব্যাক ডেটা ব্যবহার
Crashlytics.recordException(e)
showFallbackContent()
}
}
// কাস্টম কী সহ লগিং
Crashlytics.setCustomKey("screen", "Profile")
Crashlytics.setCustomKey("api_version", "v3")
Sentry নন-ফ্যাটাল ত্রুটির জন্য আরও বিস্তারিত ডায়াগনস্টিক সহ Crashlytics-এর একটি বিকল্প। Sentry SDK captureException পদ্ধতি সরবরাহ করে, যা সার্ভারে ব্যতিক্রম বিবরণ পাঠায়। Sentry-এর মূল সুবিধা হল অনুরূপ নন-ফ্যাটাল ত্রুটিগুলিকে একটি একক ইস্যুতে গ্রুপ করা, পুনরাবৃত্তি ফ্রিকোয়েন্সি বিশ্লেষণ করা এবং breadcrumbs আকারে নির্বাহ প্রসঙ্গ সরবরাহ করা — ত্রুটির আগে ব্যবহারকারীর ক্রিয়াগুলির ক্রম।
সমস্ত নন-ফ্যাটাল ত্রুটি লগ করার প্রয়োজন নেই। প্রত্যাশিত অবস্থা — সংযোগ না থাকলে নেটওয়ার্ক ব্যর্থতা — বাছাই করে লগ করা যেতে পারে। অপ্রত্যাশিত ত্রুটি — হ্যান্ডেল করা কোডে NullPointerException, অবৈধ ডেটা বিন্যাস, লজিক ত্রুটি — সর্বদা লগ করা উচিত। প্রতিটি দল তার গুরুত্বের সীমা নির্ধারণ করে: গড়ে, প্রতি 1000 ব্যবহারকারীর জন্য প্রতিদিন 10 থেকে 20টি অনন্য নন-ফ্যাটাল ত্রুটি স্বাভাবিক বলে বিবেচিত হয়। নন-ফ্যাটাল ত্রুটিতে তীব্র বৃদ্ধির জন্য সতর্কতা সেট করা গুরুত্বপূর্ণ — এটি নতুন API সংস্করণ বা রিলিজের পরে রিগ্রেশনের সমস্যা নির্দেশ করতে পারে।
মৌলিক পরিচালনা প্রক্রিয়া হল try-catch, যা ব্যতিক্রম ধরে এবং পুনরুদ্ধার কোড নির্বাহ করে। নেটওয়ার্ক অপারেশনের জন্য, সাধারণ প্যাটার্ন হল এক্সপোনেনশিয়াল ব্যাকঅফ সহ পুনরায় চেষ্টা। পার্সিং ত্রুটির জন্য, পদ্ধতি হল ডিফল্ট ফলব্যাক মান ব্যবহার করা এবং পরে সার্ভার-সাইড বিশ্লেষণের জন্য প্রসঙ্গ লগ করা।
func loadImage(from url: URL) -> UIImage? {
do {
let data = try Data(contentsOf: url)
return UIImage(data: data)
} catch {
Logger.shared.logError(error: "Image load failed: \(url)")
return UIImage(named: "placeholder")
}
}
func performRequest() async throws -> Data {
var lastError: Error? = nil
for attempt in 0..<3 {
do {
return try await URLSession.shared.data(from: url)
} catch {
lastError = error
try await Task.sleep(UInt64(pow(2, attempt)) * 1_000_000_000)
}
}
throw lastError ?? URLError(.unknown)
}
ফলাফল প্রকার — ব্যতিক্রম ছাড়া একটি বিকল্প পদ্ধতি। একটি ফাংশন Success এবং Failure ভেরিয়েন্ট সহ একটি সিল করা Result ক্লাস ফেরত দেয়। কলিং কোড উভয় ভেরিয়েন্ট স্পষ্টভাবে পরিচালনা করে, যা অপরিচালিত ত্রুটিগুলি দূর করে। Kotlin (স্ট্যান্ডার্ড লাইব্রেরিতে Result
প্রতিটি প্রকারের নন-ফ্যাটাল ত্রুটির জন্য, একটি পুনরুদ্ধার কৌশল পরিকল্পনা করা উচিত: নেটওয়ার্ক ত্রুটিতে ক্যাশেড ডেটা লোড করা, পার্সিং ত্রুটিতে ডিফল্ট মান ব্যবহার করা, UI ত্রুটিতে একটি উপাদান পুনরায় শুরু করা। একটি ভাল অনুশীলন হল অ্যাপ্লিকেশনের সাথে মিথস্ক্রিয়া সম্পূর্ণরূপে ব্লক না করে ব্যবহারকারীকে ত্রুটি বার্তা সহ একটি টোস্ট বা স্ন্যাকবার দেখানো। পুনরুদ্ধারযোগ্য এবং অ-পুনরুদ্ধারযোগ্য ত্রুটির মধ্যে পার্থক্য করা গুরুত্বপূর্ণ — পরবর্তীগুলির জন্য, পুনরুদ্ধার কৌশল ভিন্ন হবে, যেমন স্ক্রিন পুনরায় শুরু বা ডেটা সাফ করার পরামর্শ দেওয়া। পূর্ববর্তী সফল অবস্থা ক্যাশ করা প্রায়শই মোবাইল প্ল্যাটফর্মে নন-ফ্যাটাল ত্রুটি পরিচালনার সবচেয়ে সহজ এবং সবচেয়ে কার্যকর উপায়।
সচরাচর জিজ্ঞাসা
সতর্কতা কোডে সম্ভাব্য সমস্যা সম্পর্কে কম্পাইলার বা স্ট্যাটিক বিশ্লেষকের একটি সতর্কতা। নন-ফ্যাটাল ত্রুটি একটি রানটাইম ব্যতিক্রম যা ইতিমধ্যে ঘটেছে কিন্তু ক্র্যাশের কারণ হয়নি। সতর্কতা কম্পাইলেশনের আগে ঠিক করা যেতে পারে; নন-ফ্যাটাল ত্রুটি একটি catch ব্লকের মাধ্যমে নির্বাহের সময় পরিচালনা করতে হবে।
না, অত্যধিক লগিং মনিটরিংকে জঞ্জাল করে। প্রোডাকশনে অপ্রত্যাশিত ত্রুটিগুলি লগ করা উচিত, যখন প্রত্যাশিত অবস্থাগুলি উপেক্ষা করা উচিত: অফলাইনে থাকাকালীন নেটওয়ার্ক ব্যর্থতা বাছাই করে লগ করা যেতে পারে, কিন্তু হ্যান্ডেল করা কোডে NullPointerException সর্বদা লগ করা উচিত। প্রতিটি দল অ্যাপ্লিকেশন প্রসঙ্গের উপর ভিত্তি করে তার গুরুত্বের সীমা নির্ধারণ করে।
SwiftUI-তে, ত্রুটির অবস্থা ট্র্যাক করতে @Published errorState ফিল্ড সহ ObservableObject ব্যবহার করা হয়। View পরিবর্তনগুলিতে সাবস্ক্রাইব করে এবং বিকল্প বিষয়বস্তু প্রদর্শন করে। iOS 17-এর আগে, হ্যান্ডলার সহ Combine ব্যবহার করা হত; iOS 17 থেকে শুরু করে, প্রতিক্রিয়াশীল UI আপডেটের জন্য SwiftData এবং @Observable ম্যাক্রো ব্যবহার করা হয়।
হ্যাঁ, যদি ত্রুটিটি চেইন প্রতিক্রিয়া শুরু করে। উদাহরণ: একটি নন-ফ্যাটাল ছবি লোডিং ব্যর্থতা ভুল UI অবস্থার কারণ হতে পারে, যা তারপর প্রদর্শনের চেষ্টা করার সময় ক্র্যাশের কারণ হয়। প্রতিটি স্তরে নন-ফ্যাটাল ত্রুটির গুণগত পরিচালনা তাদের ফ্যাটাল স্তরে উন্নীত হওয়া থেকে রোধ করে।
iOS-এ, নন-ফ্যাটাল ত্রুটিগুলি throw সহ do-catch এর মাধ্যমে পরিচালিত হয়; Android-এ, ব্যতিক্রম সহ try-catch এর মাধ্যমে। iOS ডোমেন এবং ত্রুটি কোড সহ NSError ব্যবহার করে; Android Java/Kotlin ব্যতিক্রম ব্যবহার করে। Crashlytics recordException এর মাধ্যমে উভয় প্ল্যাটফর্মে একইভাবে কাজ করে, একটি ইউনিফাইড মনিটরিং ইন্টারফেস সরবরাহ করে।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন