Code:
...không dùng bất cứ phương pháp so sánh nào ... chức năng tự bắt lỗi của C...
Ặc ặc, bác nghĩ C++ nó "thông minh" như vậy thật sao? Không có một ngôn ngữ nào lại "tự" bắt được lỗi của chương trình. Việc bắt lỗi bao giờ cũng là công việc của người viết ra chương trình đó mà nhiều khi dò toát cả mồ hôi mới ra được.
"Try...catch" không phải là chức năng tự bắt lỗi. Nó được dùng để "tóm" lấy những ngoại lệ phát sinh trong lúc chương trình đang chạy (run-time error). Nhưng những exception đó không thể tự dưng "mọc" ra được mà lập trình viên phải viết những đoạn mã kiểm tra cụ thể và tùy theo tình huống mà sẽ dùng lệnh throw để "vứt" ra ngoài những ngoại lệ thích hợp.
Ta chỉ có thể làm cho C++ "có vẻ" như là có khả năng tự phát hiện lỗi bằng cách "ẩn" đoạn mã kiểm tra trong các class. Chẳng hạn:
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
namespace Example {
class GenericObject {
public:
virtual string typeinfo () = 0;
virtual ~GenericObject () {}
protected:
GenericObject () {}
};
class Exception: virtual public GenericObject {
public:
Exception (const string& msg) {_msg = msg;}
virtual ~Exception () {_msg.clear();}
virtual string description () {
return _msg;
}
virtual string typeinfo () {
return string ("class Exception");
}
private:
string _msg;
};
class DivisionByZero: virtual public Exception {
public:
DivisionByZero (const string& msg):Exception (msg) {}
virtual ~DivisionByZero () {}
virtual string typeinfo () {
return string ("class DivisionByZero: virtual public Exception");
}
};
class Integer: virtual public GenericObject {
public:
Integer (const int& value) {_value = value;}
virtual ~Integer () {}
virtual string typeinfo () {
return string ("class Integer: virtual public GenericObject");
}
Integer& operator= (const Integer& source) {
_value = source._value;
return *this;
}
friend Integer operator/ (const Integer& left, const Integer& right) {
if (right._value == 0) { //Error checking
throw DivisionByZero ("In class Integer: Division by Zero");
}
return Integer (int (left._value / right._value));
}
private:
int _value;
};
}
Trong đoạn mã trên, phần code kiểm tra đã được ẩn trong class Integer.
Sử dụng trong chương trình chính:
using Example::Integer;
using Example::Exception;
int main(int argc, char *argv[])
{
Integer aNumber = 10;
Integer anotherNumber = 0;
try {
Integer result = aNumber / anotherNumber;
}
catch (Exception& exception) {
cout << exception.
description () << endl
; system ("PAUSE");
return EXIT_FAILURE;
}
catch (...) { //Unhandled exceptions (may come from other class)
cout << "I don't know why you said goodbye" << endl
; system ("PAUSE");
return EXIT_FAILURE;
}
system("PAUSE");
return EXIT_SUCCESS;
}
Như bác thấy, bằng cách này ta có thể làm cho C++ "có vẻ" như là "tự" biết phát hiện lỗi nhưng thực sự điều này là không thể (ta vẫn phải check một cách tường minh trong class Integer).