Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 9 của 9
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Sử dụng SEH để bắt lỗi hệ thống

    Các ngôn ngữ như C#, Java đều có try catch để bắt các lỗi phát sinh trong chương trình. Trong VC++ cũng có một cách để thực hiện được điều này, đó là dùng cấu trúc SEH. Cấu trúc SEH cho phép bắt các lỗi nặng ( lỗi thường gây ra don't send ), chỉ trừ lỗi tràn stack. Lý do là vì cấu trúc SEH được lưu trong stack, nếu tràn stack rồi thì còn chỗ đâu mà lưu. Điểm dở duy nhất của SEH chính là nó không dùng được trong hàm thành viên của lớp.

    Sau đây là cách khai báo, rất đơn giản :


    Mã:
    __try{    // nhét đoạn code cần bắt lỗi vào đây}__except (1){    // xử lý lỗi}
    Như vậy là xong. Bây giờ mình sẽ demo xem khả năng bắt lỗi của SEH như thế nào nha.


    Mã:
    #include <stdio.h>#include <conio.h> void main(){    int *p = NULL;    int num = 0;        //__try    {        printf("Access violation.
    ");        p[0] = 0;    }    //__except (1)    {        printf("Error 1
    ");    }     //__try    {        printf("Divide by zero
    ");        num /= num;    }    //__except (1)    {        printf("Error 2
    ");    }     printf("Continue running
    ");     getch();}
    Các bạn thử chạy lần đầu, sau đó bỏ dấu comment đi để xem 2 lần khác nhau thế nào nha.

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Mã:
    #include <stdio.h>#include <conio.h>class abc{public:    int khoitao()    {        int *p = NULL;        int num = 0;                __try        {            printf("Access violation.
    ");            p[0] = 0;        }        __except (1)        {            printf("Error 1
    ");        }                __try        {            printf("Divide by zero
    ");            num /= num;        }        __except (1)        {            printf("Error 2
    ");        }                printf("Continue running
    ");                getch();        return 0;    }protected:private:};void main(){    abc a;    a.khoitao();    return;}
    sao mình vẫn dùng được với hàm thành viên trong class nè mèo con lông vàng

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    bỏ hết try và __except(1) đi để thấy

    không thì trong khoitao() trước getch() in ra giá trị của num và p

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    bạn hiểu nhầm ý của mình rồi,bạn meocon bên trên có nói rằng không thể sử dụng SEH bên trong hàm con của class vậy mà mình để nó bên trong class cũng không sao cả

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi trần trân
    bạn hiểu nhầm ý của mình rồi,bạn meocon bên trên có nói rằng không thể sử dụng SEH bên trong hàm con của class vậy mà mình để nó bên trong class cũng không sao cả
    Ờ đúng thế thật. Hôm bữa mình search đâu đó trên mạng nghe nói thế nên nói theo, chưa test thử.

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Compiler sẽ báo lỗi khi:
    1. SEH dùng chung được với C++ exception handing trong cùng 1 hàm
    2. SEH dùng trong 1 hàm có object hay bất cứ gì khởi tạo trên stack và tự hủy khi ra khỏi hàm.
    SEH nhẹ, nhỏ và nhanh hơn C++ exception vì được OS hổ trợ. SEH sử dụng được trong kernel mode. Không phải compiler nào cũng support syntax của SEH (Structure Exception Handling).

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Không chắc gì lstrcpy(a,"1234567890123456789") sẽ gây ra lỗi tràn bộ đệm bởi vì đằng sau 10 byte của mảng a có thể là vùng nhớ của biến khác, tức là vẫn có thể truy xuất được. Nó chỉ gây ra lỗi logic cho chương trình mà thôi.

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    vậy giải quyết vấn đề này thế nào,VD mình chỉ cấp phát có 10 phần tử cho 1 chuỗi,mình chỉ muốn làm thế nào mà người dùng chỉ nhập 1 chuỗi dưới 10 phần tử thôi,nếu người ta nhập quá thì mình sẽ không thực hiện lệnh nhập nữa và ra thông báo cho người dùng

  9. #9
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Cái này là lỗi logic nên theo mình chỉ có cách là nhập từng ký tự rồi dùng if để kiểm tra thôi.

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •