Fatal Error ایک سنگین غلطی ہے جو ایپلیکیشن کے فوری بند ہونے (crash) کا سبب بنتی ہے۔ non-fatal error کے برعکس، مہلک غلطی پروگرام کو بحالی کا کوئی موقع نہیں دیتی — عمل کو آپریٹنگ سسٹم یا رن ٹائم ماحول کے ذریعے جبراً ختم کر دیا جاتا ہے۔ Firebase Crashlytics 2024 کے مطابق، اوسط ایپ ہر کریش کے بعد 2.5% صارفین کھو دیتی ہے، اور مہلک غلطیوں کو ٹھیک کرنا موبائل ڈویلپمنٹ میں اولین ترجیح ہے۔ crash-free ریٹ جتنا زیادہ ہوگا، اسٹورز میں ایپ کی درجہ بندی اتنی ہی زیادہ ہوگی اور صارفین کا نقصان اتنا ہی کم ہوگا۔
اہم نکات
Fatal Error ایک ایسی غلطی ہے جس میں پروگرام کا مزید عمل ناممکن ہوتا ہے۔ آپریٹنگ سسٹم یا ورچوئل مشین ڈیٹا کی خرابی کو روکنے کے لیے عمل کو ختم کر دیتی ہے۔ iOS میں، ایک مہلک غلطی SIGABRT یا SIGSEGV سگنل کو متحرک کرتی ہے؛ Android میں، ایک غیر ہینڈلڈ استثناء جو روٹ ہینڈلر تک پہنچتا ہے اور عمل کو ختم کرتا ہے۔ ایپ فوری طور پر بند ہو جاتی ہے، صارف ہوم اسکرین پر واپس آ جاتا ہے۔
مہلک غلطی کی خصوصی علامات: مکمل اسٹیک ٹریس کے ساتھ کریش رپورٹ، ایپ کا غیر متوقع طور پر غائب ہونا، عمل کے خاتمے کے بارے میں سسٹم لاگ میں اندراج، بند ہونے سے پہلے سیاہ یا سفید اسکرین۔ صارف سیشن بحال کرنے کے کسی بھی طریقے کے بغیر ہوم اسکرین دیکھتا ہے — ایپ کو شروع سے دوبارہ لانچ کرنا ہوگا۔ iOS میں، کریش کے ساتھ ایک .crash فائل ہوتی ہے جو Xcode Organizer کے ذریعے قابل رسائی ہے۔
ہر کریش صارفین کی برقراری کو منفی طور پر متاثر کرتا ہے۔ Google Play Console 2024 کے مطابق، 99.5% سے کم crash-free ریٹ والی ایپس کو تلاش اور سفارشات میں کم درجہ بندی ملتی ہے۔ کریش ریٹ App Store اور Google Play کے لیے کلیدی معیار کے اشاروں میں سے ایک ہے — مہلک غلطیوں کی بلند سطح اپ ڈیٹس کی اشاعت کو روک سکتی ہے۔ مالیاتی اور طبی ایپلیکیشنز کے لیے، 99.9% سے نیچے crash-free ریٹ ناقابل قبول سمجھا جاتا ہے۔
Null-pointer dereference موبائل ایپلیکیشنز میں مہلک غلطیوں کی سب سے بڑی وجہ ہے۔ کسی ایسی شے کی خاصیت یا طریقہ تک رسائی حاصل کرنے کی کوشش جو null ہے Android میں NullPointerException یا iOS میں EXC_BAD_ACCESS کا سبب بنتی ہے۔ JetBrains 2023 کے مطابق، تمام پروڈکشن کریشوں میں سے تقریباً 28% null پوائنٹرز سے متعلق ہیں۔ Kotlin کا null-safety نظام اس فیصد کو نمایاں طور پر کم کرتا ہے، لیکن force unwrap اور Java مطابقت مسئلہ کے ذرائع بنی ہوئی ہیں۔
غیر موجود انڈیکس کے ذریعے کلیکشن عنصر تک رسائی کریشوں کی دوسری سب سے عام وجہ ہے۔ Java اور Kotlin میں یہ ArrayIndexOutOfBoundsException ہے؛ Swift میں — fatal error: Index out of range۔ یہ اکثر فلٹر کرنے کے بعد یا کلیکشن کا سائز متحرک طور پر تبدیل کرنے پر فہرستوں کے ساتھ کام کرتے ہوئے ہوتا ہے۔ getOrNull (Kotlin) یا indices.contains (Swift) جیسے محفوظ طریقے استعمال کرنا اس قسم کی مہلک غلطی کو روکتا ہے۔
میموری کی کمی (OutOfMemoryError)، اسٹیک اوور فلو (StackOverflowError)، غیر موجود وسائل لوڈ کرنا — وسائل کی غلطیاں اکثر مہلک ہوتی ہیں اور دوبارہ پیدا کرنا مشکل ہوتی ہیں۔ OutOfMemoryError بغیر کمپریشن کے بڑی تصاویر لوڈ کرنے یا جاری نہ کیے گئے حوالوں کی وجہ سے میموری لیک کی وجہ سے ہوتا ہے۔ StackOverflowError بنیادی کیس کے بغیر گہری تکرار یا ڈیلیگیٹ چین میں چکری کالز کی وجہ سے ہوتا ہے۔
Deadlock، race condition، تکرار کے دوران کلیکشن میں تبدیلی — ملٹی تھریڈنگ غلطیاں غیر متعین طور پر ظاہر ہوتی ہیں اور تشخیص کرنا سب سے مشکل ہوتی ہیں۔ Android میں، مختلف تھریڈز سے ArrayList میں ترمیم کرتے وقت ConcurrentModificationException؛ iOS میں، مطابقت پذیری کے بغیر NSMutableArray میں ترمیم کرتے وقت کریش۔ Kotlin coroutines (structured concurrency) یا Swift Actors (iOS 16+) استعمال کرنے سے ہم وقتی کریشوں کا امکان کم ہوتا ہے۔
بنیادی فرق بحالی کی صلاحیت ہے۔ Non-Fatal Error پروگرام کو جاری رکھنے کی اجازت دیتا ہے: نیٹ ورک ٹائم آؤٹ try-catch کے ذریعے ہینڈل کیا جاتا ہے، پارسنگ کی غلطی کو ڈیفالٹ ویلیو سے بدل دیا جاتا ہے۔ Fatal Error کا ایسا کوئی راستہ نہیں ہے — کریش ناگزیر ہے اور ایپ کو دوبارہ شروع کرنا ہوگا۔ ان غلطیوں کی اقسام کے درمیان حد ایپلیکیشن آرکیٹیکچر کے ذریعے متعین ہوتی ہے۔
| خصوصیت | Fatal Error | Non-Fatal Error |
|---|---|---|
| ایپ کا خاتمہ | ہاں | نہیں |
| بحالی | ناممکن | catch بلاک کے ذریعے ممکن |
| معلومات جمع کرنا | صرف کریش رپورٹر | کوڈ سے لاگنگ |
| UX نقصان | مکمل سیشن کی ناکامی | عارضی تکلیف |
| عام مثال | NullPointerException | IOException |
ایک ہی غلطی ایک پلیٹ فارم پر مہلک اور دوسرے پر غیر مہلک ہو سکتی ہے۔ صفر سے تقسیم Java/Kotlin میں ArithmeticException پھینکتی ہے (غیر مہلک — پکڑی جا سکتی ہے)، جبکہ Swift میں یہ fatal error: Division by zero کا سبب بنتی ہے (بغیر پکڑے جانے کے کریش)۔ ڈیولپر کو غلطیوں کے انتظام کو ڈیزائن کرتے وقت مخصوص زبان اور رن ٹائم ماحول کے رویے کو مدنظر رکھنا چاہیے۔ مہلک اور غیر مہلک کے درمیان حد کو سمجھنا موبائل ایپلیکیشن کی خرابی برداشت کرنے والی آرکیٹیکچر کی تعمیر کی بنیاد ہے۔
Firebase Crashlytics موبائل ایپلیکیشنز میں کریشوں کی تشخیص کا حقیقی معیار ہے۔ SDK خود بخود کریش سے ٹھیک پہلے اسٹیک ٹریس، ڈیوائس کی حالت، OS ورژن اور لاگز جمع کرتا ہے۔ ڈیش بورڈ ایک جیسے کریشوں کو ایک مسئلے میں گروپ کرتا ہے، متاثرہ صارفین کی تعداد، تعدد اور ایپ کے اس ورژن کو دکھاتا ہے جس میں کریش ہوا۔
// Android ایپلیکیشن میں Crashlytics کو ابتدائیہ بنانا
class MainApplication : Application() {
override fun onCreate() {
super.onCreate()
FirebaseApp.initializeApp(this)
Crashlytics.setCustomKey("build_type", "production")
}
}
// کریش تشخیص کے لیے حسب ضرورت صارف ڈیٹا مرتب کرنا
Crashlytics.setUserId("user_12345")
Crashlytics.setCustomKey("screen", "ProfileFragment")
Crashlytics.setCustomKey("api_response", responseCode)
// انضمام کی جانچ کے لیے جبری کریش
Crashlytics.crash()
Sentry زیادہ تفصیلی تشخیص کے ساتھ ایک متبادل ہے۔ Sentry نہ صرف اسٹیک ٹریس بلکہ تمام متغیرات کی حالت، غلطی سے پہلے واقعات کی ترتیب اور عمل کے سیاق و سباق کو بھی دکھاتا ہے۔ Sentry کے Breadcrumbs مہلک غلطی سے پہلے صارف کے اقدامات کی زنجیر کو دوبارہ تشکیل دینے کی اجازت دیتے ہیں: بٹن کلکس، اسکرینوں کے درمیان منتقلی، نیٹ ورک کی درخواستیں۔ Sentry جامع معیار کے تجزیے کے لیے کارکردگی اور سیشن کی نگرانی بھی فراہم کرتا ہے۔
iOS پر کریشوں کی درست تشخیص کے لیے، dSYM فائلیں (ڈیبگ سمبلز) Crashlytics یا Sentry میں اپ لوڈ کرنا ضروری ہیں۔ dSYM کے بغیر، اسٹیک ٹریس میں فنکشن کے ناموں کی بجائے صرف میموری ایڈریس ہوں گے۔ Android کے لیے، ProGuard یا R8 استعمال کرتے وقت میپنگ فائلیں اپ لوڈ کرنا ضروری ہیں۔ Xcode میں build phase یا Gradle پلگ ان کے ذریعے dSYM اپ لوڈ کا آٹومیشن پروڈکشن بلڈز کے لیے لازمی ہے۔
بنیادی روک تھام کا طریقہ تمام اختیاری اور nullable اقدار کا safe unwrapping ہے۔ Swift میں if-let اور Kotlin میں ?: کے ساتھ let کا استعمال null پوائنٹر کی غلطیوں کو ختم کرتا ہے۔ قدر کی ضمانت کے بغیر کوئی force unwrap نہیں۔ Kotlin اور Swift دونوں کمپائلر ممکنہ طور پر خطرناک کارروائیوں کے بارے میں خبردار کرتے ہیں — پروڈکشن کوڈ میں ان انتباہات کو نظر انداز نہیں کیا جا سکتا۔
// safe unwrapping کے ذریعے fatal error کی روک تھام
func processUser(id: String) -> String {
guard let user = database.findUser(by: id) else {
return "User not found"
}
guard let email = user.email else {
return "Email not set"
}
return email
}
// کلیکشن عناصر تک محفوظ رسائی
func safeGet <T>(items: [T], index: Int) -> T? {
guard items.indices.contains(index) else { return nil }
return items[index]
}
// رسائی سے پہلے صفوں کی حدود کی جانچ
let numbers = [1, 2, 3]
if numbers.indices.contains(5) {
print(numbers[5])
} else {
print("Index out of range")
}
Defensive programming تحفظ کی دوسری سطح ہے۔ ہمیشہ فنکشنز کے ان پٹ پیرامیٹرز کی جانچ کریں، force unwrap کی بجائے Optional یا Result لوٹائیں، اور ڈویلپمنٹ کے دوران ابتدائی غلطی کا پتہ لگانے کے لیے ڈیبگ بلڈز میں assert استعمال کریں۔ حدی صورتوں (null، خالی کلیکشنز، غلط انڈیکس) کے لیے یونٹ ٹیسٹ کو ایپلیکیشن کے کاروباری منطق میں تمام عوامی داخلی نکات کا احاطہ کرنا چاہیے۔
React Native اور SwiftUI میں، آپ error boundary سیٹ کر سکتے ہیں — ایک جزو جو رینڈرنگ کی مہلک غلطیوں کو پکڑتا ہے اور کریش کی بجائے فال بیک UI دکھاتا ہے۔ یہ صارف کے نقطہ نظر سے مہلک UI غلطی کو غیر مہلک میں بدل دیتا ہے — ایپ کام کرتی رہتی ہے اور صارف سفید اسکرین کی بجائے انٹرفیس کے مخصوص بلاک میں غلطی کا پیغام دیکھتا ہے۔
CI/CD پائپ لائن میں خودکار جانچوں کا انضمام: جامد تجزیہ (Kotlin کے لیے Detekt، Swift کے لیے SwiftLint)، حقیقی آلات پر UI ٹیسٹ چلانا، ٹیسٹ ماحول میں crash-free ریٹ کی جانچ کرنا۔ کریش ریٹ کی حد سے تجاوز کرنے پر انضمام کو روکنا (تجویز کردہ حد: فی کمٹ 0.1% سے زیادہ نئے کریش نہیں)۔
اکثر پوچھے گئے سوالات
نہیں، fatal error کے بعد بحالی ناممکن ہے — عمل OS سطح پر ختم ہو جاتا ہے۔ واحد راستہ محفوظ تعمیرات، defensive programming اور ڈویلپمنٹ کے دوران حدی صورتوں کی جامع جانچ کے ذریعے مہلک غلطی کو ہونے سے پہلے روکنا ہے۔
Segfault (SIGSEGV) ایک قسم کی مہلک غلطی ہے جو میموری کے ناجائز علاقے تک رسائی کے وقت ہوتی ہے۔ FATAL ERROR تمام ناقابل بحالی غلطیوں کے لیے ایک عام اصطلاح ہے، جس میں segfault، abort، stack overflow، out of memory اور runtime میں غیر ہینڈلڈ استثنائی شامل ہیں۔
Crashlytics (Firebase) یا Sentry SDK کا انضمام خود بخود تمام غیر ہینڈلڈ استثنائیوں کو جمع کرتا ہے۔ SDK OS سگنلز اور runtime استثنائیوں کو روکتا ہے، اسٹیک ٹریس اور سیاق و سباق کے ساتھ کریش رپورٹ تیار کرتا ہے، اور ایپ کے اگلے لانچ پر اسے سرور کو بھیجتا ہے۔
کریش ہینڈلنگ کی جانچ کے لیے، ڈیبگ بلڈ میں force crash استعمال کیا جاتا ہے۔ Crashlytics مہلک غلطی کا محاکمہ کرنے کے لیے crash() طریقہ فراہم کرتا ہے۔ یونٹ ٹیسٹ guard اور if-let کی درستگی کی تصدیق کرتے ہیں، جبکہ UI ٹیسٹ ڈیٹا ان پٹ اور انٹرفیس کی حالتوں کی حدی صورتوں کا احاطہ کرتے ہیں۔
نہیں، صرف غیر ہینڈلڈ استثنائی مہلک ہوتی ہیں۔ try-catch کے ذریعے پکڑی گئی استثنائی غیر مہلک ہے۔ ہینڈلڈ اور غیر ہینڈلڈ استثنائی کے درمیان فرق یہ طے کرتا ہے کہ آیا ایپ ختم ہوگی یا صارف کے تجربے کو کم سے کم نقصان کے ساتھ متبادل حالت میں کام جاری رکھے گی۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں