সি প্রোগ্রামিং এরর হ্যান্ডলিং - C error handling
সি প্রোগ্রামিং এ যেহেতু এরর হ্যান্ডেলিং(error handling) এর সরাসরি কোনো সাপোর্ট নাই, কিন্তু সিস্টেম প্রোগ্রামিং ল্যাংগুয়েজ হওয়ায় ইহা রিটার্ন ভ্যালুর উপর ভিত্তিকরে lower level এ এক্সেস সরবরাহ করে।
যেকোনো error এর জন্য অধিকাংশ সি অথবা এমনকি ইউনিক্স ফাংশন কল(call) এর ক্ষেত্রেও -1
অথবা NULL
রিটার্ন করে এরর কোড হিসাবে errno
সেট করে। ইহা গ্লোবাল ভ্যারিয়েবল হিসাবে সেট হয় এবং এই সংকেত দেয় যে, ফাংশন কল করার সময় এরর সংঘটিত হয়েছে।
আপনি বিভিন্ন ধরনের এরর কোড দেখে থাকতে পারেন যা <errno.h>
হেডার ফাইলে ডিফাইন্ড করা আছে।
সুতরাং একজন সি প্রোগ্রামার রিটার্ন ভ্যালু চেক করতে পারে এবং রিটার্ন ভ্যালুর উপর ভিত্তিকরে উপযুক্ত কাজটি করতে সক্ষম হয়।
প্রোগ্রাম ইনিশিয়ালাইজিং(initializing) এর সময় errno
এর ভ্যালু 0(zero) সেট করা খুবই ভাল। ভ্যালু 0 ইঙ্গিত দেয় যে, প্রোগ্রামে কোনো এরর নাই।
সি errno, perror() এবং strerror() ফাংশন
সি প্রোগ্রামিং ল্যাংগুয়েজ perror()
এবং strerror()
দুটি ফাংশন সরবরাহ করে যার মাধ্যমে errno
এর সাথে সম্পর্কযুক্ত টেক্সট মেসেজ প্রদর্শন করানো যেতে পারে।
-
perror()
ফাংশনটি , এর মধ্য দিয়ে যে স্ট্রিং অতিক্রম করানো হয় তা, এরপরে কোলন(:) এবংerrno
এর চলমান ভ্যালুর জন্য পাঠ্য উপস্থাপনা(textual representation)-কে প্রদর্শন করায়। -
strerror()
ফাংশনটিerrno
এর চলমান ভ্যালুর পাঠ্য উপস্থাপনা(textual representation) এর পয়েন্টার রিটার্ন করে।
চলুন, বিদ্যমান নাই এমন একটি ফাইল খোলার(open) চেষ্টা করি এবং এর মাধ্যমে একটি ত্রুটির(error) সৃষ্টি করি। ব্যবহার দেখানোর জন্য এখানে আমরা উভয় ফাংশন-ই ব্যবহার করেছি।
কিন্তু আপনি ত্রুটি দেখানোর জন্য আপনার পছন্দমত এক বা তার অধিক পদ্ধতি ব্যবহার করতে পারেন।
দ্বিতীয় গুরুত্বপূর্ণ বিষয় হলো ফাইল প্রবাহের(stream) সমস্ত ত্রুটিসমূহের(errors) আউটপুট নেওয়ার জন্য stderr
ব্যবহার করা উচিৎ।
#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;
}
উপরের প্রোগ্রামটি কম্পাইল এবং এক্সিকিউট করা হলে নিচের ন্যায় ফলাফল দেখাবেঃ
Value of errno: 2
Error printed by perror: No such file or directory
Error opening file: No such file or directory
0(শূন্য) দিয়ে ভাগের ফলে উৎপন্ন Error
প্রায় সময়েই প্রোগ্রামাররা কোনো সংখ্যাকে ভাগ করার সময় ভাজক শূন্য কিনা চেক করে দেখে না যা পরিশেষে রান টাইম এরর(runtime error) উৎপন্ন করে।
নিচের প্রোগ্রামে ভাগ করার পূর্বে ভাজক 0(শূন্য) কিনা চেক করার মাধ্যমে এই সমস্যার সমাধান দেখানো হলোঃ
#include <stdio.h>
#include <stdlib.h>
int 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);
}
উপরের প্রোগ্রামটি কম্পাইল এবং এক্সিকিউট করা হলে ইহা নিচের ন্যায় ফলাফল দেখাবেঃ
Division by zero! Exiting...
প্রোগ্রাম থেকে বের হওয়ার স্ট্যাটাস
প্রোগ্রামের কাজ সফলভাবে সম্পন্ন হওয়ার পরে প্রোগ্রাম থেকে সচারচর EXIT_SUCCESS
এর স্ট্যাটাস ভ্যালু নিয়ে বের হয়। এখানে EXIT_SUCCESS
হলো ম্যাক্রো এবং ইহাকে 0 দ্বারা সঙ্গায়িত করা হয়।
আপনার প্রোগ্রামে যদি কোনো এরর(error) থাকে এবং আপনি যদি প্রোগ্রাম থেকে বের হতে চান তাহলে EXIT_FAILURE
স্ট্যাটাস নিয়ে আপনাকে প্রোগ্রাম থেকে বের হতে হবে যাকে -1 দ্বারা সঙ্গায়িত করা হয়।
সুতরাং চলুন উপরের প্রোগ্রামকে নিচের মত করে লিখিঃ
#include <stdio.h>
#include <stdlib.h>
int 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);
}
উপরের প্রোগ্রামটি কম্পাইল এবং এক্সিকিউট করা হলে ইহা নিচের ন্যায় ফলাফল দেখাব:
Value of quotient : 4