Từ 1 tới 10 trên tổng số 10 kết quả

Đề tài: try - throw - catch trong C++ có tác dụng gì?

  1. #1
    Ngày gia nhập
    02 2007
    Bài viết
    27

    Mặc định try - throw - catch trong C++ có tác dụng gì?

    Em xài BC++, khi thử viết try, throw, catch thì thấy chữ chuyển sang màu trắng, nghĩa là BC++ có hỗ trợ mấy cái này. Nhưng trong phần help thì lại không thấy nó nhắc đến. Viết thử 1 cái code thì nó báo Synctax Error mà không nói gì thêm.
    Code của em là:
    C++ Code:
    1. int x=10, y=0;
    2. try
    3.    {
    4.      x=x/y;
    5.      throw "Khong the chia";
    6.     }
    7. catch(char *str)
    8.     {
    9.        printf("%s",str);
    10.      }
    Mong mấy anh chỉ giáo, sửa lại sao cho nó chạy đúng, em đang cần gấp.
    Xin cám ơn!


    Tucõi phước
    Tìnhdây oan

  2. #2
    Ngày gia nhập
    01 2007
    Bài viết
    412

    Mình nghĩ bạn nên sửa đoạn code trên lại như sau:
    C++ Code:
    1. nt x=10, y=0;
    2. try
    3.    {
    4.      x=x/y;
    5.  
    6.     }
    7. catch(char *str)
    8.     {
    9.        throw "Khong the chia";
    10.      }
    Câu lệnh nằm trong block try là câu lệnh mà ta biết chắc là sẽ có sự cố khi biên dịch chương trình, còn block catch chứa các câu lệnh để xử lý sự cố khi câu lệnh trong block try gặp sự cố.

  3. #3
    Ngày gia nhập
    02 2007
    Bài viết
    27

    Em đã thử rồi, nhưng hễ BC++ thấy mặt thằng try thì nó lại la lối: "Expression Syntax". Bực mình ghê, thậm chí ví dụ về try-throw-catch của MSDN còn chạy sai. Hổng lẽ ngay cả Microsoft còn hông biết xài cái này? T_T!
    Em sửa code là
    C++ Code:
    1. int x=10, y=0;
    2. try
    3.    {
    4.      //Cố ý để trống
    5.     }
    6. catch (int a)
    7.     {
    8.      }
    Thì nó cũng tô đậm dòng try và thông báo "Expression Syntax" :(


    Tucõi phước
    Tìnhdây oan

  4. #4
    Ngày gia nhập
    01 2007
    Bài viết
    412

    Hi, cậu thử sửa lại như thế này thử xem sao nhé,có gì nói cho mình kết quả nhé
    C++ Code:
    1. int x=10,y=0;
    2. try
    3. {
    4.      x=x/y;
    5. }
    6. catch (y=0)
    7. {
    8.     printf("Oh no!!Khong the chia cho so 0!!");
    9. }

  5. #5
    Ngày gia nhập
    02 2007
    Bài viết
    27

    Em đã thử rồi! Thậm chí sửa lại catch(y==0) nó cũng báo lỗi Expression Syntax
    Nó cứ tô đậm dòng try và báo lỗi, cho dù chỉnh sửa kiểu gì đi nữa.
    Mà mấy anh cho em hỏi Expression Syntax là kí rì zậy?


    Tucõi phước
    Tìnhdây oan

  6. #6
    Ngày gia nhập
    01 2007
    Bài viết
    412

    Mặc định try - throw - catch trong C++ có tác dụng gì?

    Trích dẫn Nguyên bản được gửi bởi hirikarate Xem bài viết
    Em đã thử rồi! Thậm chí sửa lại catch(y==0) nó cũng báo lỗi Expression Syntax
    Nó cứ tô đậm dòng try và báo lỗi, cho dù chỉnh sửa kiểu gì đi nữa.
    Mà mấy anh cho em hỏi Expression Syntax là kí rì zậy?
    Expression Syntax --> lỗi cú pháp. Bạn thử xem trong những sách nói về nắm bắt ngoại lệ trong các ebooks nói về C/C++ thử xem

  7. #7
    Ngày gia nhập
    11 2006
    Bài viết
    75

    bác thử cái code này xem sao:
    C++ Code:
    1. #include <cstdlib>
    2. #include <iostream>
    3.  
    4. using namespace std;
    5.  
    6. int main(int argc, char *argv[])
    7. {
    8.     int x=10, y=0;
    9.     try
    10.     {
    11.         if (y==0)
    12.             throw "Khong the chia";
    13.         cout << x/y << endl;
    14.     }
    15.     catch (const char *str)
    16.     {
    17.         cout << str << endl;
    18.         system ("PAUSE");
    19.         return EXIT_FAILURE;
    20.     }
    21.     system ("PAUSE");
    22.     return EXIT_SUCCESS;
    23. }
    Our dreams are young and we both know they take us where we want to go...

  8. #8
    Ngày gia nhập
    02 2007
    Bài viết
    27

    Yêu cầu bài tập là không dùng bất cứ phương pháp so sánh nào như IF, SWITCH, FOR, WHILE ...
    Vì vậy mình mới nảy ra ý định dùng chức năng tự bắt lỗi của C, nhưng làm hoài không được. ^_^!
    Có ai giúp em ko zạ ?


    Tucõi phước
    Tìnhdây oan

  9. #9
    Ngày gia nhập
    11 2006
    Bài viết
    75

    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:

    C++ Code:
    1. #include <cstdlib>
    2. #include <iostream>
    3. #include <string>
    4.  
    5. using namespace std;
    6.  
    7. namespace Example {
    8.    
    9.     class GenericObject {
    10.     public:
    11.         virtual string typeinfo () = 0;
    12.         virtual ~GenericObject () {}
    13.     protected:
    14.         GenericObject () {}
    15.     };
    16.    
    17.     class Exception: virtual public GenericObject {
    18.     public:
    19.         Exception (const string& msg) {_msg = msg;}
    20.         virtual ~Exception () {_msg.clear();}
    21.        
    22.         virtual string description () {
    23.             return _msg;
    24.         }
    25.        
    26.         virtual string typeinfo () {
    27.             return string ("class Exception");
    28.         }
    29.        
    30.     private:
    31.         string _msg;
    32.     };
    33.    
    34.     class DivisionByZero: virtual public Exception {
    35.     public:
    36.         DivisionByZero (const string& msg):Exception (msg) {}
    37.         virtual ~DivisionByZero () {}
    38.         virtual string typeinfo () {
    39.             return string ("class DivisionByZero: virtual public Exception");
    40.         }
    41.     };
    42.    
    43.     class Integer: virtual public GenericObject {
    44.     public:
    45.         Integer (const int& value) {_value = value;}
    46.         virtual ~Integer () {}
    47.        
    48.         virtual string typeinfo () {
    49.             return string ("class Integer: virtual public GenericObject");
    50.         }
    51.                    
    52.         Integer& operator= (const Integer& source) {
    53.             _value = source._value;
    54.             return *this;
    55.         }
    56.        
    57.         friend Integer operator/ (const Integer& left, const Integer& right) {
    58.             if (right._value == 0) { //Error checking
    59.                 throw DivisionByZero ("In class Integer: Division by Zero");
    60.             }    
    61.             return Integer (int (left._value / right._value));
    62.         }
    63.          
    64.     private:
    65.         int _value;
    66.     };  
    67. }

    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:

    C++ Code:
    1. using Example::Integer;
    2. using Example::Exception;
    3.  
    4. int main(int argc, char *argv[])
    5. {
    6.     Integer aNumber = 10;
    7.     Integer anotherNumber = 0;
    8.    
    9.     try {
    10.         Integer result = aNumber / anotherNumber;
    11.     }
    12.    
    13.     catch (Exception& exception) {
    14.         cout << exception.description () << endl;
    15.         system ("PAUSE");
    16.         return EXIT_FAILURE;
    17.     }
    18.    
    19.     catch (...) { //Unhandled exceptions (may come from other class)
    20.         cout << "I don't know why you said goodbye" << endl;
    21.         system ("PAUSE");
    22.         return EXIT_FAILURE;
    23.     }
    24.        
    25.     system("PAUSE");
    26.     return EXIT_SUCCESS;
    27. }

    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).
    Our dreams are young and we both know they take us where we want to go...

  10. #10
    Ngày gia nhập
    05 2011
    Bài viết
    1

    C++ Code:
    1. int x = 10;
    2. int y = 0;
    3.  
    4. try
    5. {
    6.      if (y != 0)
    7.      {
    8.            throw (float)x / y;
    9.      }
    10.      else
    11.      {
    12.            throw "Khong the chia cho 0";
    13.      }
    14. }
    15. catch (float z)
    16. {
    17.      cout << z << endl;
    18. }
    19. catch (char* s)
    20. {
    21.      cout << s << endl;
    22. }

Các đề tài tương tự

  1. type của exception object trong lệnh throw
    Gửi bởi aloman trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 06-09-2011, 04:25 PM
  2. Exceptions, try, throw và catch có mục đích và tác dụng gì?
    Gửi bởi itmanhieu trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 26-05-2011, 08:10 PM
  3. Sử dụng try{} catch{} trong lập trình C++?
    Gửi bởi shesap trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 4
    Bài viết cuối: 07-01-2011, 04:05 PM
  4. throw TRONG DEV_C++ thuộc thư viện nào?
    Gửi bởi tetuongrua trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 30-12-2010, 05:14 PM
  5. Xử lý lỗi như thế nào bằng throw, catch
    Gửi bởi iamme22021990 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 31-01-2010, 07:36 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn