با سلام خدمت تمامی دوستان عزیز سایت پی وی لرن .و کاربرانی که دوره کامل آموزش زبان C را دنبال می کنند. و کاربرانی که با سری آموزش های زبان C همراهمون هستند. تبدیل نوع در زبان C و انواعش ،Integer Promotion و تبدیلات ریاضی رایج در C رو جلسه قبل داشتیم .در این جلسه خطا و مدیریت خطا در زبان C از جمله خطای تقسیم بر صفر در C و وضعیت خروج برنامه رو بیان خواهیم کرد .
زبان C به طور مستقیم از مدیریت خطا (Error Handling) پشتیبانی نمی کند. اما در سطح پایین تر شما می توانید با استفاده از مقادیر بازگشتی توابع خطاها را مدیریت کنید. اکثر توابع موجود در C در صورت بوجود آمدن خطا مقدار -۱ یا NULL را باز میگردانند و شماره خطا را در متغیر errno تنظیم می کند. این یک متغیر عمومی یا جهانی است که نشان دهنده بوجود آمدن خطا در هنگام فراخوانی یک تابع است. شما می توانید شماره خطاهای (error code) مختلفی که header <error.h> تعریف شده است را پیدا کنید.
بنابراین یک برنامه نویس C می تواند با بررسی مقادیر بازگشتی، خطاهای بوجود آمده را کنترل کند. بهتر است در ابتدا برنامه مقدار متغیر errno را ۰ تنظیم کنید. مقدار ۰ نشان دهنده این است که هیچ خطایی در برنامه رخ نداده است.
زبان برنامه نویسی C توابع perror() و strerror() را در اختیار ما قرار می دهد تا با استفاده از آن ها متن خطاها براساس شماره آن ها چاپ کنیم.
بیایید سعی کنیم یک وضعیت خطا را شبیه سازی کنیم و سعی کنیم فایلی را که وجود ندارد باز کنیم. در اینجا ما از هر دو تابع استفاده می کنم، اما شما می توانید از یک یا چند روش برای چاپ خطاها استفاده کنید. دومین نکته مهم این است که شما باید جریان فایل stderr را برای خروجی تمام خطاها استفاده کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #include <stdio.h> #include <errno.h> #include <string.h> extern int errno ; int main () { FILE * pf; int errnum; pf = fopen ("unexist.txt", "rb"); if (pf == NULL) { errnum = errno; fprintf(stderr, "Value of errno: %d\n", errno); perror("Error printed by perror"); fprintf(stderr, "Error opening file: %s\n", strerror( errnum )); } else { fclose (pf); } return 0; } |
زمانی که کد بالا کامپایل و اجرا شود، نتیجه زیر را تولید خواهد کرد:
1 2 3 | Value of errno: 2 Error printed by perror: No such file or directory Error opening file: No such file or directory |
این یک مشکل رایج است که در زمان تقسیم هر عدد، برنامه نویسان بررسی نمی کنند که مخرج کسر صفر نباشد و در نهایت یک خطای زمان اجرا ایجاد می کند.
کد زیر این را با چک کردن اینکه آیا مخرج قبل از تقسیم برابر صفر است را نشان می دهد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <stdio.h> #include <stdlib.h> main() { int dividend = 20; int divisor = 0; int quotient; if( divisor == 0){ fprintf(stderr, "Division by zero! Exiting...\n"); exit(-1); } quotient = dividend / divisor; fprintf(stderr, "Value of quotient : %d\n", quotient ); exit(0); } |
زمانی که کد بالا کامپایل و اجرا شود، نتیجه زیر را تولید خواهد کرد:
1 | Division by zero! Exiting... |
یک روش معمول بازگشت دادن مقدار EXIT_SUCCESS است در صورتی که برنامه با موفقیت انجام شده باشد . در اینجا EXIT_SUCCESS یک ماکرو است و به عنوان ۰ تعریف شده است.
اگر وضعیت خطا در برنامه بوجود آید ،مقدار بازگشتی EXIT_FAILURE است که به عنوان ۱- تعریف شده است.
اجازه دهید برنامه فوق را به صورت زیر بنویسیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <stdio.h> #include <stdlib.h> main() { int dividend = 20; int divisor = 5; int quotient; if( divisor == 0) { fprintf(stderr, "Division by zero! Exiting...\n"); exit(EXIT_FAILURE); } quotient = dividend / divisor; fprintf(stderr, "Value of quotient : %d\n", quotient ); exit(EXIT_SUCCESS); } |
اجازه دهید برنامه فوق را به صورت زیر بنویسیم:
1 | Value of quotient : 4 |
اینم از خطا و مدیریت خطا در زبان C و خطای تقسیم بر صفر در C ، در ادامه با توابع بازگشتی در زبان C خدمتتون خواهیم رسید.