مدیریت خطای حرفه ای
سلام :)
میدونیم که وقتی تو یه برنامه هر خطایی ایجاد بشه ، مدیریت نشده باشه ، فورس کلوز میده ، کاربران از این صفحه متنفرن !
میدونم که میشه با مدیریت خطا تو هر نقطه فورس کلوز رو کم تر کرد ، ولی من میخوام هر Exception ای ، چه هندل شده ، چه هندل نشده ( یعنی کرش برنامه ) ایجاد شد ، تابع CrashFoZoooL مطلع بشه !
یکی از ایده های تو ذهنم ، اینه که همه ی اکتیویتی ها از یه کلاسی که خودم ساختم ، و توش خطا مدیریت میشه اکستند بشه
public class ExceptionHandler() extends Activity
{
// some code to get all Exceptions
}
public class ActivityFirst extends ExceptionHandler
{
//some usual codes that may make an Exception !
}
نمی دونم چقدر عملیه
بهتر نیست که برای هر قسمت که ممکنه خطا بده یک try,catch درست کنیم؟ این کار باعث میشه خیلی سریعتر و بهتر بتونیم خطاهارو کنترل کنیم و فکر میکنم اصولی تر باشه
باز بهتر میشد اگر میشد توی این catch ها خود خطا رو گزارش بدیم.یعنی همونی که توی logcat به ما نشون میده رو توی برنامه ببینیم که اگر کاربری توی ناکجا آباد یک خطا گرفت بتونه کد خطا یا متنش رو برامون ارسال کنه و ما بفهمیم خطا مال کدوم قسمت بوده
به دلیل خواسته ALU جان که خیلی کمک بزرگی برای من هست می خوام جانانه در این مورد صحبت کنم. ( به اسم ALU به کام دوستان ) :)
خطا Compile Time چیست؟
بهترین نوع خطاست. چون قبل از اجرا تکلیف شما رو مشخص می کنه و بهتون میگه آقا مشکل داری، آقا متغیر تعریف نشده، خانوم اینجا ممکن Null Pointer بیاد بیرون و ... . پس همیشه ایده آل این است که خطاهای Compile Time داشته باشیم و تاجاییکه میشه کدمون رو جوری بنویسی که Compile Time ایراد بگیره.
مثلاً وقتی با دیتابیس کار می کنید و یک Query می نویسید، اگر اسم فیلد غلط باشه، در حین اجرا خطا می گیره و نه موقع Compile . اما اگر همین بانک رو بصورت PDO و Objective برنامه نویسی کنید، میگه Field ـی که نام بردی در کلاس وجود نداره و اصلاً برنامه اجرا نمیشه.
هر چقدی IDE هوشمند تر باشه، خطاهای Compile Time بیشتری تولید می شن و این اصلاً به معنی گیر بودن IDE نیست بلکه به معنی وسواسی بودن مثبت IDE هست. نمونش هم همون Override بود که برای بچه ها مفصل توضیح دادم چرا هشدارش به عنوان Error لازم هست.
خطای Runtime ؟
هر خطایی که در لحظه اجرا بوجود بیاد اعم از خطای نوع 2 یا خطای نوع 3 . این نوع خطاها معمولاً باعث Crash برنامه میشن و اگر نشن باعث خراب شدن برنامه از آن لحظه به بعد میشن.
فرض کنید توی یک کارخونه یک هشدار آتش سوزی وصل کردن. یک نفر رو هم نگهبانش گذاشتن. وقتی کسی زیر این سنسور سیگار میکشه، هشدار روشن میشه و نگهبان بدبخت سراسیمه می دوه و متوجه میشه یکی سیگار کشیده. میاد بالا و روی این چراغ هشدار رو یک پارچه می ندازه که دیگه هشدارش رو نبیه. و وای به حال روزی که کارخونه آتیش بگیره :)
Try...Catch هایی که داخل اونها هیچ پیامی نباشه و مثلا ننوشته باشه e.printStackTrace دقیقاً مثل همین پارچه ای می مونن که میشه خفه کننده هشدارها. پس همیشه و همه جا یادتون باشه که هشدار رو خفه نکنید.
حالا فرض کنید توی این کارخونه سنسور حرارت کار نذاشته باشن. اگر دمای محیط به 100 درجه هم برسه، به کسی خبری داده نمیشه. این یک عیب هست. اما تو واقعیت چقدر این احتمال وجود داره؟ تقریباً 0%
چیزهایی که در اندروید به شما هشدار نمی دن از این دسته هستند. بعضی موقع ها هم به دلیل بی تجربگی تولید کننده متد یا کلاس، برای چیزهای واجب، هشداری قرار داده نمیشه. مثل هشدار مربوط به تبدیل اعداد. اما بعضی موقع ها برای چیزهای غیر ضروری مثل JsonFormat هشدار قرار داده میشه که می تونست قرار داده نشه ( نهایت در صورت خطا NULL برمیگرده بیرون )
چگونگی Handle کردن خطاهای دارای هشدار:
این رو بلد شدید، همون قضیه Try...Catch هست.
چگونگی Handle کردن خطاهای بدون هشدار:
یک چیزی بهتون می گم که لذتش رو ببرید، کد زیر رو بنویسید و بعد یک Null Pointer Exception تولید کنید، ببینید چی میشه :)
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btnTest = (Button) findViewById(R.id.btnTest);
final TextView txtLog = (TextView) findViewById(R.id.txtLog);
Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler());
btnTest.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String test = null;
test.length();
}
});
}
public static class CustomExceptionHandler implements UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread t, Throwable e) {
Log.e("MyTag", stackToString(e));
System.exit(1);
}
public static String stackToString(Throwable ex) {
StringWriter errors = new StringWriter();
ex.printStackTrace(new PrintWriter(errors));
return errors.toString();
}
}
}
برنامه استاد جالب بود
ولی من با همین try -catch اکثر جاهای برنامه ای رو که نوشته بودم رو بعد از printStackTrace اومدم یک toast گذاشتم و برای هر پیغام هم یه شماره گذاشتم مثلا وقتی ارتباط با اینرنت ش قطع بود ارور شماره 800 میداد یا موقع نوشتن روی دیتا بیسس کرش میکرد ارور 900 میداد بعد روی گوشی های مختلف تست کردم مثلا بخصوص وقتی اینرنت نداشتن و برنامه ارور میداد خیلی خوششون میامد و توجه میکردن ...
فقط یه مشکل خیلی اعصابمو خورد کرد این بود که مثلا زمانی که سرعت اینترنت کم هست و قطعی وصلی داره برنامه داره مثلا json رو میخونه وسط خوندش نت قطع بشه برنامه همونجا میمونه و ارور میده و try catch هم کار ساز نبود و مینوشت برنامه پاسخ نمیدهد میخاهید ببنیدش یا نه
واقعا نمیدونم باید چه کنم
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .