آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

مدیریت خطای حرفه ای

مجتبی یگانه  12 سال پیش  12 سال پیش
+7 0

سلام :)

میدونیم که وقتی تو یه برنامه هر خطایی ایجاد بشه ، مدیریت نشده باشه ، فورس کلوز میده ، کاربران از این صفحه متنفرن !

میدونم که میشه با مدیریت خطا تو هر نقطه فورس کلوز رو کم تر کرد ، ولی من میخوام هر 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 !
}

نمی دونم چقدر عملیه 

0 0
خوب چرا از لاگ کت و قابلیت دیباگینگ استفاده نمیکنی تا خطا بدست بیاد؟ (12 سال پیش)
0 0
میخوام وقتی برنامه دست کاربر اجرا میشه ، لاگ رو بگیرم ! ، لاگ ها رو که فقط تو IDE میشه دید ! (12 سال پیش)
0 0
به نظر من که عملیه چون واقعا این زبان برنامه نویسی منو به وجد آمورد اینقدر که زیبا و منعطف هست! این لینک کمکتون نمیکنه(حالا قابلیته لینک در قالب متن نداره اینجا) : لینک (12 سال پیش)
0 0
تشکر از وقتی که گذاشتید ، بزودی راه حلی که دارم روش کار می کنم رو میزارم ، اما هنوز منتظر ایده ی سایر دوستان هستم (12 سال پیش)
 برای این سوال 3 پاسخ وجود دارد.
پاسخ به سوال 
Hajhosseini  12 سال پیش
0 0

بهتر نیست که برای هر قسمت که ممکنه خطا بده یک try,catch درست کنیم؟ این کار باعث میشه خیلی سریعتر و بهتر بتونیم خطاهارو کنترل کنیم و فکر میکنم اصولی تر باشه

باز بهتر میشد اگر میشد توی این catch ها خود خطا رو گزارش بدیم.یعنی همونی که توی logcat به ما نشون میده رو توی برنامه ببینیم که اگر کاربری توی ناکجا آباد یک خطا گرفت بتونه کد خطا یا متنش رو برامون ارسال کنه و ما بفهمیم خطا مال کدوم قسمت بوده

0 0
منم دقیقا همین نکته رو در متن سوال ذکر کردم "میدونم که میشه با مدیریت خطا تو هر نقطه فورس کلوز رو کم تر کرد"  ، شما بهتر بود این رو توی نظرات میگفتید ، دقت کنید ، حتما نباید به همه ی سوال ها پاسخ داد ، خیلی وقت ها یه کامنت کوچیک ، بهترین پاسخه ، اما هر چیزی سرجای خودش ، بسیار تشکر میکنم ، اما پاسخ شما فقط تایید و تاکید  سوال من بود ! (12 سال پیش)
0 0
اگر مفید نبود شرمنده (12 سال پیش)
0 0
شما خیلی هم آقایی ، تشکر میکنم ، از پاسختون (12 سال پیش)
پاسخ به سوال 
uncocoder  12 سال پیش
+11 0

به دلیل خواسته 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();
}
}
}
0 0
تشکر میکنم ، جرقه ای برای ادامه ی حرفه ای تر مدیریت خطا ها بود :) ، توی تایپ هایراکی دیدم در واقع برای مدیریت بهتر ما به پدرشون رجوع میکنیم (12 سال پیش)
0 0
موفق باشی. (12 سال پیش)
پاسخ به سوال 
imanbenoit  12 سال پیش
0 0

برنامه استاد  جالب بود 

  ولی  من   با همین try -catch    اکثر جاهای برنامه ای رو که نوشته بودم رو   بعد از          printStackTrace    اومدم   یک  toast گذاشتم  و برای هر  پیغام هم  یه شماره گذاشتم   مثلا وقتی ارتباط با اینرنت ش قطع بود ارور شماره 800 میداد  یا موقع  نوشتن روی دیتا بیسس  کرش میکرد ارور 900 میداد  بعد  روی گوشی های مختلف تست کردم   مثلا بخصوص وقتی اینرنت نداشتن  و برنامه ارور میداد  خیلی خوششون میامد  و توجه میکردن ...

فقط  یه مشکل خیلی  اعصابمو خورد کرد این بود که  مثلا زمانی که سرعت اینترنت کم هست و قطعی وصلی داره  برنامه  داره مثلا json  رو میخونه   وسط  خوندش  نت قطع بشه برنامه همونجا میمونه و ارور میده    و try catch هم  کار ساز نبود و مینوشت برنامه پاسخ نمیدهد میخاهید ببنیدش یا نه

واقعا  نمیدونم باید چه کنم

 

 

0 0
علت مشکل شما سرعت کم نیست بلکه عدم استفاده از رشته ها علت این مشکل هست ، برنامه فرصت پاسخ به UI رو نداره (12 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .