Xử lý ngoại lệ trong C ++: Thử, bắt, ném Ví dụ

Mục lục:

Anonim

Xử lý ngoại lệ trong C ++ là gì?

Xử lý ngoại lệ trong C ++ cung cấp cho bạn cách xử lý các trường hợp không mong muốn như lỗi thời gian chạy. Vì vậy, bất cứ khi nào một trường hợp bất ngờ xảy ra, điều khiển chương trình được chuyển đến các chức năng đặc biệt được gọi là trình xử lý.

Để nắm bắt các trường hợp ngoại lệ, bạn đặt một số phần mã dưới sự kiểm tra ngoại lệ. Phần mã được đặt trong khối try-catch.

Nếu một tình huống ngoại lệ xảy ra trong phần mã đó, một ngoại lệ sẽ được đưa ra. Tiếp theo, trình xử lý ngoại lệ sẽ tiếp quản quyền kiểm soát chương trình.

Trong trường hợp không có trường hợp ngoại lệ nào xảy ra, mã sẽ thực thi bình thường. Các trình xử lý sẽ bị bỏ qua.

Trong hướng dẫn C ++ này, bạn sẽ học:

  • Xử lý ngoại lệ trong C ++ là gì?
  • Tại sao phải xử lý ngoại lệ?
  • Các Từ khoá Xử lý Ngoại lệ
  • Cú pháp:
  • Ngoại lệ tiêu chuẩn C ++
  • Ngoại lệ do người dùng xác định

Tại sao phải xử lý ngoại lệ?

Đây là lý do sử dụng Xử lý ngoại lệ trong C ++:

  • Bạn sẽ tách mã xử lý lỗi của mình khỏi mã bình thường. Mã sẽ dễ đọc hơn và dễ bảo trì hơn.
  • Các hàm có thể xử lý các ngoại lệ mà chúng chọn. Ngay cả khi một hàm ném ra nhiều ngoại lệ, nó sẽ chỉ xử lý một số. Người gọi sẽ xử lý các trường hợp ngoại lệ chưa được suy nghĩ.

Các Từ khoá Xử lý Ngoại lệ

Xử lý ngoại lệ trong C ++ xoay quanh ba từ khóa sau:

  • ném - khi một chương trình gặp sự cố, nó sẽ ném ra một ngoại lệ. Từ khóa ném giúp chương trình thực hiện ném.
  • catch - một chương trình sử dụng một trình xử lý ngoại lệ để bắt một ngoại lệ. Nó được thêm vào phần của một chương trình mà bạn cần xử lý sự cố. Nó được thực hiện bằng cách sử dụng từ khóa bắt.
  • try - khối try xác định khối mã mà một số ngoại lệ nhất định sẽ được kích hoạt. Nó phải được theo sau bởi một / nhiều khối bắt.

Giả sử một khối mã sẽ tạo ra một ngoại lệ. Ngoại lệ sẽ được phát hiện bằng một phương pháp sử dụng từ khóa try and catch. Khối try / catch phải bao quanh mã có thể tạo ra một ngoại lệ. Mã như vậy được gọi là mã được bảo vệ.

Cú pháp:

Cú pháp try / catch có cú pháp sau:

try {// the protected code} catch( Exception_Name exception1 ) {// catch block} catch( Exception_Name exception2 ) {// catch block} catch( Exception_Name exceptionN ) {// catch block}
  • Mặc dù chúng ta có một câu lệnh try, nhưng chúng ta có thể có nhiều câu lệnh bắt.
  • ExceptionName là tên của ngoại lệ được bắt.
  • Ngoại lệ1, ngoại lệ2 và ngoại lệN là tên được xác định của bạn để tham chiếu đến các ngoại lệ.

Ví dụ 1:

#include#includeusing namespace std;int main() {vector vec;vec.push_back(0);vec.push_back(1);// access the third element, which doesn't existtry{vec.at(2);}catch (exception& ex){cout << "Exception occurred!" << endl;}return 0;}

Đầu ra:

Đây là ảnh chụp màn hình của mã:

Giải thích mã:

  1. Bao gồm tệp tiêu đề iostream trong chương trình để sử dụng các chức năng của nó.
  2. Bao gồm tệp tiêu đề vectơ trong chương trình để sử dụng các chức năng của nó.
  3. Bao gồm không gian tên std trong chương trình vào các lớp của nó mà không cần gọi nó.
  4. Gọi hàm main (). Logic của chương trình nên được thêm vào bên trong phần thân của nó.
  5. Tạo một vector có tên là vec để lưu trữ dữ liệu số nguyên.
  6. Thêm phần tử 0 vào vec-tơ có tên là vec.
  7. Thêm phần tử 1 vào vec-tơ có tên vec.
  8. Một lời bình luận. Nó sẽ được trình biên dịch C ++ bỏ qua.
  9. Sử dụng câu lệnh try để bắt một ngoại lệ. Dấu {đánh dấu phần bắt đầu của phần nội dung của khối try / catch. Mã được thêm vào bên trong nội dung sẽ trở thành mã được bảo vệ.
  10. Cố gắng truy cập phần tử được lưu trữ ở chỉ mục 2 (phần tử thứ ba) của vec-tơ có tên là vec. Phần tử này không tồn tại.
  11. Phần cuối của khối try / catch.
  12. Nắm bắt ngoại lệ. Thông báo lỗi trả về sẽ được lưu trữ trong biến ex.
  13. In ra một số thông báo trên bảng điều khiển nếu trường hợp ngoại lệ được phát hiện.
  14. Cuối phần thân của khối bắt.
  15. Chương trình sẽ trả về một giá trị khi thực hiện thành công.
  16. Kết thúc phần thân của hàm main ().

Ví dụ 2:

#include using namespace std;double zeroDivision(int x, int y) {if (y == 0) {throw "Division by Zero!";}return (x / y);}int main() {int a = 11;int b = 0;double c = 0;try {c = zeroDivision(a, b);cout << c << endl;}catch (const char* message) {cerr << message << endl;}return 0;}

Đầu ra:

Đây là ảnh chụp màn hình của mã:

Giải thích mã:

  1. Bao gồm tệp tiêu đề iostream trong chương trình để sử dụng các chức năng của nó.
  2. Bao gồm không gian tên std trong chương trình vào các lớp của nó mà không cần gọi nó.
  3. Tạo một hàm có tên là zeroDivision nhận hai đối số nguyên, x và y. Hàm sẽ trả về một kết quả kép.
  4. Sử dụng câu lệnh if để kiểm tra xem giá trị của đối số biến y có bằng 0. Dấu {đánh dấu phần đầu của phần nội dung if hay không.
  5. Thông báo sẽ được trả lại / ném nếu y là 0.
  6. Cuối phần nội dung của câu lệnh if.
  7. Hàm zeroDivision sẽ trả về giá trị của x / y.
  8. Cuối phần nội dung của hàm zeroDivision.
  9. Gọi phương thức main (). Dấu {đánh dấu sự bắt đầu của phương thức này.
  10. Khai báo một biến số nguyên và gán cho nó giá trị 11.
  11. Khai báo một biến số nguyên b và gán giá trị 0 cho nó.
  12. Khai báo một biến kép c và gán cho nó giá trị 0.
  13. Sử dụng câu lệnh try để bắt một ngoại lệ. Dấu {đánh dấu phần bắt đầu của phần nội dung của khối try / catch. Mã được thêm vào bên trong nội dung sẽ trở thành mã được bảo vệ.
  14. Gọi hàm zeroDivision và chuyển tới các đối số a và b, nghĩa là 11 và 0. Kết quả của phép toán này sẽ được lưu trữ trong biến c.
  15. In ra giá trị của biến c trên bàn điều khiển.
  16. Phần cuối của khối try / catch.
  17. Nắm bắt ngoại lệ. Thông báo lỗi trả về sẽ được lưu trữ trong thông báo biến.
  18. In thông báo lỗi trả về trên bảng điều khiển.
  19. Cuối phần thân của khối bắt.
  20. Chương trình sẽ trả về một giá trị khi thực hiện thành công.
  21. Kết thúc phần thân của hàm main ().

Ngoại lệ tiêu chuẩn C ++

C ++ đi kèm với một danh sách các ngoại lệ tiêu chuẩn được xác định trong lớp . Chúng được mô tả dưới đây:

ngoại lệ Sự miêu tả
std :: ngoại lệ Đây là một ngoại lệ và là lớp cha của tất cả các ngoại lệ C ++ tiêu chuẩn.
std :: bad_alloc Ngoại lệ này được ném bởi một từ khóa mới.
std :: bad_cast Đây là một ngoại lệ do dynamic_cast ném ra.
std :: bad_exception Một thiết bị hữu ích để xử lý các ngoại lệ không mong muốn trong các chương trình C ++.
std :: bad_typeid Một ngoại lệ do typeid ném ra.
std :: logic_error Về mặt lý thuyết, ngoại lệ này có thể được phát hiện bằng cách đọc mã.
std :: domain_error Đây là một ngoại lệ được đưa ra sau khi sử dụng miền không hợp lệ về mặt toán học.
std :: invalid_argument Một ngoại lệ được đưa ra vì sử dụng các đối số không hợp lệ.
std :: length_error Một ngoại lệ được đưa ra sau khi tạo một chuỗi std :: lớn.
std :: out_of_range Ném bằng phương pháp.
std :: runtime_error Đây là một ngoại lệ không thể được phát hiện thông qua việc đọc mã.
std :: Over_error Ngoại lệ này được đưa ra sau khi xảy ra lỗi tràn toán học.
std :: range_error Ngoại lệ này được đưa ra khi bạn cố gắng lưu trữ một giá trị nằm ngoài phạm vi.
std :: underflow_error Một ngoại lệ được đưa ra sau khi sự xuất hiện của dòng dưới dạng toán học.

Ngoại lệ do người dùng xác định

Lớp C ++ std :: exception cho phép chúng ta định nghĩa các đối tượng có thể được ném ra dưới dạng ngoại lệ. Lớp này đã được định nghĩa trong tiêu đề . Lớp cung cấp cho chúng ta một hàm thành viên ảo có tên là gì.

Hàm này trả về một chuỗi ký tự được kết thúc bằng null kiểu char *. Chúng ta có thể ghi đè nó trong các lớp dẫn xuất để có một mô tả ngoại lệ.

Thí dụ:

#include #include using namespace std;class newException : public exception{virtual const char* what() const throw(){return "newException occurred";}} newex;int main() {try {throw newex;}catch (exception& ex) {cout << ex.what() << '\n';}return 0;}

Đầu ra:

Đây là ảnh chụp màn hình của mã:

Giải thích mã:

  1. Bao gồm tệp tiêu đề iostream trong chương trình của chúng tôi. Chúng tôi sẽ sử dụng các chức năng của nó mà không gặp lỗi.
  2. Bao gồm tệp tiêu đề ngoại lệ trong chương trình của chúng tôi. Chúng tôi sẽ sử dụng các chức năng của nó như những gì không có lỗi.
  3. Bao gồm không gian tên std trong chương trình của chúng tôi để sử dụng các lớp của nó mà không cần gọi nó.
  4. Tạo một lớp mới có tên newException. Lớp này kế thừa lớp ngoại lệ của C ++.
  5. Phần đầu của phần thân lớp.
  6. Ghi đè hàm thành viên ảo mà () đã định nghĩa trong tệp tiêu đề ngoại lệ. Sau đó, chúng tôi sẽ mô tả ngoại lệ của riêng chúng tôi, ngoại lệ mới.
  7. Bắt đầu định nghĩa về ngoại lệ mới.
  8. Thông báo sẽ được trả lại nếu trường hợp ngoại lệ mới bị bắt.
  9. Kết thúc định nghĩa của ngoại lệ mới.
  10. Phần cuối của lớp newException. Newex là tên được sử dụng để bắt ngoại lệ mới của chúng ta, sau đó newException sẽ được gọi.
  11. Gọi hàm main (). Logic của chương trình nên được thêm vào bên trong phần thân của nó. Dấu {đánh dấu phần bắt đầu của phần thân của nó.
  12. Sử dụng câu lệnh try để đánh dấu mã mà chúng ta cần đánh dấu ngoại lệ trong đó. Dấu {đánh dấu phần bắt đầu của phần nội dung của khối try / catch. Mã được bao quanh bởi điều này sẽ được bảo vệ.
  13. Hãy ném ngoại lệ newex nếu nó bị bắt.
  14. Kết thúc phần thử thân.
  15. Sử dụng câu lệnh catch để bắt ngoại lệ. Thông báo lỗi ngoại lệ sẽ được lưu trữ trong biến ex.
  16. In thông báo lỗi ngoại lệ trên bảng điều khiển.
  17. Cuối phần nội dung của câu lệnh bắt.
  18. Chương trình sẽ trả về một giá trị nếu nó thực thi thành công.
  19. Cuối phần thân của hàm main ().

Tóm lược:

  • Với xử lý ngoại lệ trong C ++, bạn có thể xử lý lỗi thời gian chạy.
  • Lỗi thời gian chạy là những lỗi xảy ra trong quá trình thực hiện chương trình.
  • Xử lý ngoại lệ giúp bạn xử lý mọi trường hợp không mong muốn trong chương trình của mình.
  • Khi tình huống bất ngờ xảy ra, quyền điều khiển chương trình được chuyển cho người xử lý.
  • Để bắt một ngoại lệ, bạn đặt một phần mã bên dưới khối try-catch.
  • Từ khóa throw giúp chương trình ném ra các ngoại lệ, giúp chương trình xử lý sự cố.
  • Từ khóa try giúp xác định khối mã mà một số ngoại lệ nhất định sẽ được kích hoạt.
  • Chúng ta có thể ghi đè hàm what () của tệp tiêu đề ngoại lệ để xác định các ngoại lệ của chúng ta.