Error And Exception
ডার্ট প্রোগ্রাম এক্সিকিউশন এর সময় রানটাইম সমস্যা ঘটতে পারে। এই সমস্যা গুলোকে আমরা দুই ভাগে ভাগ করতে পারি
- Errors
- Exceptions
Errors এবং Exceptions এর মধ্যে কখন কোনটা ব্যবহার করবেন তা সিদ্ধান্ত নেওয়ার বিষয়ে সবসময় কিছু বিভ্রান্তি থাকে। আপনার সমস্ত সিদ্ধান্ত simple principle of recoverability এর উপর ভিত্তি করে হবে। যদি আপনার কোড এমন একটি সমস্যা তৈরি করে যা থেকে যুক্তিসঙ্গতভাবে পুনরুদ্ধার করা যেতে পারে, সেইক্ষেত্রে Exceptions ব্যবহার করুন। বিপরীতভাবে, যদি কোডটি এমন একটি সমস্যা তৈরি করে যা থেকে পুনরুদ্ধার করা যায় না, বা যেখানে কন্টিনিউ করা আরও সমস্যা তৈরী করবে, সেইক্ষেত্রে Errors ব্যবহার করুন ৷
Error
আপনার কোডে প্রোগ্রামিং ভূল থাকলে, একটি Error ঘটতে পারে এবং এটি প্রোগ্রামার দ্বারা ঠিক করা প্রয়োজন হতে পারে। নিচের main() ফাংশনটি পরীক্ষা করা হলো:
main() { // Fixed length list List list = new List(5); // Fill list with values for (int i = 0; i < 10; i++) { list[i] = i; } print('Result is ${list}'); }
আমরা লিস্ট ক্লাসের একটি ইনস্ট্যান্স তৈরি করেছিলাম এবং এর সাথে একটি নির্দিষ্ট length সেট করেছিলাম। তারপর সেই লুপে যেখানে আমরা লিস্টে ভ্যালু রাখতে চাইছিলাম সেখানে আমরা লিস্টের নির্দিষ্ট সাইজের চেয়ে বেশি আইটেম রাখতে চেষ্টা করেছিলাম যার ফলে রেঞ্জ Error এর সম্মুখীন হয়ে পড়েছে। নিচে এররটি দেখা যায়:
Uncaught Error: RangeError (index): Index out of range: index should be less than 5: 5
কোডে একটি প্রিরিকুইসিতে ভায়োলেশন এর কারণে একটি Error ঘটেছে। এটি সম্ভবত সঠিক range এর বাইরে একটি ভ্যালু ইন্সার্ট এর চেষ্টা করা হয়েছিল। এই ধরণের failure সাধারণত কোড এবং কলিং API এর মধ্যে থেকে হয়। এই ক্ষেত্রে, RangeError প্রিরিকুইসিতে ভায়োলেশন নির্দেশ করে। Dart SDK এ CastError, NoSuchMethodError, Unsupported Error, OutOfMemoryError এবং StackOverflowError এর মতো আরও কিছু Error রয়েছে, যা dart.core লাইব্রেরীর errors.dart ফাইলে পাওয়া যায়। সমস্ত Error ক্লাস Error ক্লাস থেকে Inherit হয় । উপরের উদাহরণে, range_error.dart ফাইলের ৬ নম্বর লাইনে Error ঘটেছে।
আমরা আমাদের কোডে Error Catch করতে পারি, কিন্তু কোডটি খারাপভাবে ইম্প্লিমেন্টেড করা হয়েছে বলে, আমাদের বরং এটা ঠিক করা উচিত। Errors Catch করার জন্য ডিজাইন করা হয় না, তবে আমরা বিভিন্ন সময় Error throw করতে পারি । একটি ডার্ট প্রোগ্রাম এর এক্সেকিউশন সাধারণত বন্ধ হয়ে যাই যখন একটি Error ঘটে।
Exception
Exception, Error এর বিপরীতে। Exception সাধারণত Catch করা যাই এবং সেই Exception সম্পর্কে তথ্য পাওয়া যাই , কিন্তু তারা স্ট্যাক ট্রেস তথ্য ইনক্লুড করে না। Exception পুনরুদ্ধারযোগ্য পরিস্থিতিতে ঘটবে এবং একটি প্রোগ্রামের Execution বন্ধ করে না। আপনি একটি non-null অবজেক্ট Exception হিসেবে throw করতে পারেন , কিন্তু একটি নতুন এক্সেপশন ক্লাস তৈরি করা ভাল যেটি একটা abstract class Exception ইমপ্লিমেন্ট করবে এবং toString মেথড ওভাররাইড করে additional information provide করবে । একটি Exception অবশ্যই Catch clause এর মধ্যে হ্যান্ডেল করা লাগবে। নিচে এসেপশন্স ব্যবহার না করে কোডের একটি উদাহরণ:
import 'dart:io'; main() { // File URI Uri uri = new Uri.file("test.json"); // Check uri if (uri != null) { // Create the file File file = new File.fromUri(uri); // Check whether file exists if (file.existsSync()) { // Open file RandomAccessFile random = file.openSync(); // Check random if (random != null) { // Read file List notReadyContent = random.readSync(random.lengthSync()); // Check not ready content if (notReadyContent != null) { // Convert to String String content = new String.fromCharCodes(notReadyContent); // Print results print('File content: ${content}'); } // Close file random.closeSync(); } } else { print("File doesn't exist"); } } }
এখানে এই কোড এর অউটপুটস :
File content: [{ name: Test, length: 100 }]
আপনি দেখতে পাচ্ছেন, Error detection এবং handling একটি বিভ্রান্তিকর স্প্যাগেটি কোডের দিকে নিয়ে যায়। এখানে কোডের লজিক্যাল ফ্লো হারিয়ে গেছে, এটি পড়তে এবং বুঝতে কঠিন করে তোলে। সুতরাং, আমরা আমাদের কোডকে নিম্নরূপ Exceptions ব্যবহার করার জন্য রূপান্তর করি:
import 'dart:io'; main() { RandomAccessFile random; try { // File URI Uri uri = new Uri.file("test.json"); // Create the file File file = new File.fromUri(uri); // Open file random = file.openSync(); // Read file List notReadyContent = random.readSync(random.lengthSync()); // Convert to String String content = new String.fromCharCodes(notReadyContent); // Print results print('File content: ${content}'); } on ArgumentError catch (ex) { print('Argument error exception'); } on UnsupportedError catch (ex) { print('URI cannot reference a file'); } on FileSystemException catch (ex) { print("File doesn't exist or accessible"); } finally { try { random.closeSync(); } on FileSystemException catch (ex) { print("File can't be close"); } } }
উপরের কোড এ কোনো Exceptions না ঘটলেও অথবা _random _ফাইলটি ক্লোজ না করতে পারলেও _finally _ব্লক এর কোড ইন্ডেপেন্ডেলটি _execute _হবে। এখানে আমরা working কোড এবং Exception সম্পূর্ণ আলাদা ভাবে হ্যান্ডেল করেছি এবং আমরা চাইলে আরো uncaught exceptions গুলো অ্যাড করতে পারি।
আমাদের উদাহরণে, আমরা _ArumentError _এবং _UnsupportError _কে FileSystemException -এর সাথে মিল রেখেছি। এখানে এটা দেখানো হয়েছে যে এরর এবং এক্সেপশন এর নেচার প্রায় একই এবং আমরা যে কোনো সময় এটা caught করতে পারি|