Chủ đề: Sử dụng SEH để bắt lỗi hệ thống
-
22-05-2009, 06:37 PM #1Junior Member
- 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}
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();}
View more random threads:
- Hiểu COM là gì?
- Lỗi khi thực hiện Start Debug(F5): Chương trình không chạy kết quả cuối sau khi sửa
- Sử dụng SEH để bắt lỗi hệ thống
- Ogre, Lập trình game với Ogre graphic engine
- NtCreateThreadEx Inject DLL SystemProcess windows Vista/7
- Hướng dẫn làm game bằng C/C++
- Phần mềm 4Gb patch cho 32bit App. How Do They Do It?
- Detect Windows Vista/7 bằng sử dụng GetVersionEx API
- hồn trương ba, da hàng thịt
- Thuật toán PCA trong vấn đề nhận dạng ảnh
-
24-05-2009, 03:46 PM #2Banned
- 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;}
-
24-05-2009, 04:29 PM #3Junior Member
- 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
-
24-05-2009, 04:34 PM #4Junior Member
- 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ả
-
24-05-2009, 06:00 PM #5Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi trần trân
-
25-05-2009, 02:39 PM #6Junior Member
- 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).
-
30-10-2009, 05:11 PM #7Junior Member
- 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.
-
30-10-2009, 05:18 PM #8Junior Member
- 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
-
30-10-2009, 05:36 PM #9Junior Member
- 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.
Ngọc Bích xanh bản chất thuộc dòng đá đá hoa (jade). Và cẩm thạch là tên gọi chung của ngọc bích. Vì thực chất chúng thuộc dòng đá đa khoáng được hình thành từ chất Silicat dưới dạng dioxy. Ngọc bích...
Chia sẻ Vòng tay ngọc bích xanh là...