Khi làm việc với C# hoặc Java, tôi đã sử dụng để tạo các lớp ngoại lệ bao gồm các ngoại lệ khác với tư cách thành viên lớp. Ví dụ:Ngoại lệ trong các trường hợp ngoại lệ trong C++
public class MyException : Exception {
private MyException ex;
private String message;
public String what() {
return this.message;
}
public String stack() {
if(ex != null) {
StringBuilder s;
s.append(this.what());
s.append(this.ex.stack());
return s.toString();
}
return this.what();
}
}
Tôi đang tìm các ví dụ về cùng một chủ đề nhưng đối với C++ và tôi không thể tìm thấy (có thể tôi không tìm kiếm đúng cụm từ, bạn có thể thấy tiêu đề của câu hỏi này không phải là rất ưa thích).
Dù sao, cách chính xác để thực hiện điều đó trong C++ là gì? Là nó để lưu trữ các ngoại lệ bên trong như một con trỏ hoặc một tài liệu tham khảo? (Tôi nghĩ rằng tôi có thể cần một con trỏ để nó có thể là null khi nó là ngoại lệ đầu tiên). Khi tôi đưa ra ngoại lệ, nó có phải là con trỏ được tạo với new
không?
EDIT: Có thể những gì tôi đã viết là một chút bối rối hoặc không phải là một thực hành lập trình nổi tiếng (được chấp nhận). Vì vậy, tôi sẽ chỉ định làm thế nào tôi có ý định sử dụng lớp này với một đoạn:
try {
// Code that throws an exception of type MyException
} catch(MyException ex) {
MyException another = new MyException();
another.setEx(ex);
another.setMessage("A message that explains where the other exception was caught and on what conditions");
throw another;
}
bạn không thể có nhiều ngoại lệ trong C++. Nếu một ngoại lệ mới được ném trước khi ngoại lệ hiện tại bị bắt, chương trình được chấm dứt (chính xác hơn là 'std :: terminate' được gọi) –
@Gene: Đây là một biến thể về rethrow, nơi ngoại lệ hiện tại được nhồi trong một ngoại lệ mới . Có lẽ không khả thi nếu không thu gom rác thải. –
@Ben Voigt: Có thể khả thi nếu không có bộ sưu tập rác nếu không khó nhớ chính xác khi nào các trường hợp ngoại lệ được gọi là destructors. –