توی زبان های مختلف برنامه نویسی راه های مختلفی برای مدیریت کردن Error ها وجود دارد. بعضی زبان ها مثل C یا GO از error code استفاده میکنند و بعضی زبان ها هم مثل Java یا CPP از مفهوم Exception برای مدیریت کردن خطا ها یا حالت های استثنا استفاده میکنند.
قبل از اینکه مطلب رو ادامه بدم توضیح کوتاهی در مورد Exception ها بدم.
استثنا ها در واقع اتفاق هایی هستند که در زمان اجرای یک برنامه اتفاق میافتند و باعث میشوند که برنامه ها مسیر عادی خودشون رو پیش نرن.
به عنوان مثال فرض کنید من قصد دارم داخل برنامم اسم دانش آموز هایی که داخل یک فایل نوشته شدن رو بخونم. اگر در زمان اجرا به هر دلیلی اون فایل وجود نداشته باشه (حذف شده باشه یا کسی اون رو به مسیر دیگه ای منتقل کرده باشه) یا اصلا اون فایل وجود داشته باشه ولی برنامه من مجوز خواندن اطلاعات رو نداشته باشه در این حالت ها Exception اتفاق میافتد.
بودن Exception ها داخل برنامه ها مشکلی نداره و اینکه Error Code روش بهتری هست برای مدیریت خطا یا Exception قابل بحث هست اما نکته ای که مهمه این هست که از Exception ها برای کنترل کردن جریان اجرای برنامه ها استفاده نکنیم.
توی این مطلب ( که این پست هم بر اساس اون نوشته شده ) نویسنده با یک مثال این مفهوم رو توضیح داده :
به کد زیر نگاه کنید. داخل این کد تابعی داریم که چک میکنه عدد ما مثبت هست یا منفی و اگر عدد ما منفی هست یک استثنا رو پرتاب میکنه.
int get_positive_value(int x) {
if(x < 0) {
throw std::runtime_error("it is not positive!");
}
return x;
}
حالا فرض کنید یک آرایه داریم که میخواهیم همه عناصرش رو با هم جمع کنیم. دو روش رو میتونیم داشته باشیم.
روش اول :
int sum = 0;
for (int x : a) {
if(x < 0) {
sum += -x;
} else {
sum += x;
}
}
روش دوم :
int sum = 0;
for (int x : a) {
try {
sum += get_positive_value(x);
} catch (...) {
sum += -x;
}
}
همانطور که از داخل کد ها هم مشخصه توی روش دوم کنترل جریان برنامه با استفاده از Exception انجام شده.
چیزی که مسلمه و از اول این پست هم چند باری بهش اشاره کردیم این هست که روش دوم روش مناسبی برای برنامه نویسی نیست. اما چرا ؟
دو دلیل اصلی براش وجود داره :
دلیل یک ) این شکل از برنامه نویسی تمیز و خوانا نیست. شاید توی نگاه اول بنظر خوانا بیاد ولی توی کد های کمی بزرگتر و پیچیده تر قضیه فرق میکنه.
دلیل دوم ) نویسنده مقاله اصلی این دو تا برنامه رو از نظر performance آزمایش کرده و به نتیجه جالبی رسیده. اونم اینکه توی روش اول کد برنامه 10000 برابر سریع تر از روش دوم بوده که عدد قابل توجهی هست. در مورد جزئیات بیستر در مورد نحوه آزمایش و مقایسه میتونید مقاله اصلی رو نگاه کنید