Có bốn điều, hai lớn và hai nhỏ. Một điều tại một thời điểm ...
1. rethrow sử dụng w/o ngoại lệ hoạt động
Một tuyên bố throw;
được sử dụng để tái ném một ngoại lệ mà hiện tại đang bắt. Ví dụ:
try {
do_something();
} catch (const std::exception &) {
throw; // This statement re-throws an exception that was caught in this "catch" block.
}
Trong trường hợp của bạn, bạn đang sử dụng throw;
mà không đánh bắt bất kỳ trường hợp ngoại lệ (hay nói cách trật tự - nó không xuất hiện bên catch
khối trực tiếp hoặc gián tiếp), do đó chương trình của bạn được chấm dứt. Khi có nhu cầu ném và không ném lại một ngoại lệ, như trong trường hợp của bạn, bạn phải chỉ định một đối tượng ngoại lệ được ném. Ví dụ:
throw std::runtime_error("Something bad happened");
2. nhận tất cả điều khoản mà không tái ném một ngoại lệ bắt
nhận tất cả bạn khoản (catch (...)
) là hoàn toàn hợp pháp C++. Tuy nhiên, nó không tái ném ngoại lệ bị bắt. Mặc dù nó là một mã C++ hợp pháp, việc sử dụng đó là một điều cấm kỵ. Thời gian chạy C và C++ thường sử dụng các loại ngoại lệ đặc biệt để thực hiện một số chức năng nhất định. Ví dụ: NPTL đang sử dụng ngoại lệ để thực hiện hủy bỏ chuỗi. Nếu bạn bắt được ngoại lệ đó bằng cách sử dụng catch (...)
, chuỗi sẽ không bị hủy và bạn sẽ có thời gian xấu. Nói chung, bạn phải bắt ngoại lệ theo loại của họ.Trong hầu hết các trường hợp, ngoại lệ được thừa kế từ std::exception
và do đó bạn phải viết catch (const std::exception &)
hoặc nếu bạn muốn bắt được loại chính xác, - catch(const TypeYouExpect &)
. Nếu bạn phải, tuy nhiên, sử dụng bắt tất cả, hãy nhớ để ném lại. Ví dụ:
try {
do_something();
} catch (...) {
throw; // DO NOT FORGET TO RE-THROW.
}
3. Tiêu đề đặt tên ...
Bạn đã bao gồm tiêu đề C trong khi C++ cung cấp tiêu đề riêng của mình cho các tính năng C chuẩn. Vì vậy, tiêu đề:
#include <stdio.h>
.. nên là:
#include <cstdio>
C++ chức năng C cụ thể được điều trị đặc biệt. Ví dụ, chúng trở nên có sẵn trong không gian tên std
. Để bạn có thể sử dụng std::open()
thay vì chỉ open()
hoặc ::open()
. Không có vấn đề lớn, nhưng là rất khuyến khích cách để đi.
4. Trở về từ chính.
Không giống như chức năng main()
của C, C++ rất đặc biệt. Nó cho phép bạn không có return 0;
. Đây là hành vi mặc định. Vì vậy, trừ khi bạn thực sự cần phải trả lại một số giá trị, bạn có thể tiết kiệm cho mình một thời gian bằng cách không gõ return 0;
. Tuy nhiên, hãy nhớ rằng, main
là chức năng duy nhất như vậy và ở mọi nơi khác, bạn phải trả lại một cách rõ ràng, trừ khi hàm được đánh dấu void
.
Hy vọng điều đó sẽ hữu ích. Chúc may mắn!
bằng cách mã của bạn trông C_ish_ hơn so với C++ _ ish_, chỉ cần làm quen với mã trong C++ nếu bạn chọn C++ là ngôn ngữ của sự lựa chọn, cách này mã của bạn có thể dễ dàng trở thành một sự pha trộn kỳ lạ của ngôn ngữ mà không có bất kỳ lợi ích nào cả và chỉ có thể làm cho cuộc sống của bạn khó học không có gì mới và hữu ích. Đúng là C được hỗ trợ theo C++ mà không có vấn đề gì, nhưng chỉ cố gắng có một cách tiếp cận đơn giản hơn và tuyến tính hơn khi mã hóa. – Ken