2011-11-16 33 views
31

Tôi vừa tạo ra hệ thống phân cấp ngoại lệ và muốn truyền char* cho hàm tạo của một trong các lớp dẫn xuất của tôi với thông báo cho biết có gì sai, nhưng dường như std::exception không có hàm tạo tôi làm như vậy. Tuy nhiên, có một thành viên lớp học được gọi là what() mà sẽ gợi ý rằng một số thông tin có thể được thông qua.
Làm thế nào tôi có thể (tôi có thể?) Vượt qua văn bản đến lớp được thừa kế của một std::exception để thông qua thông tin với lớp ngoại lệ của tôi, vì vậy tôi có thể nói ở đâu đó trong các mã:Cách chính xác để thừa kế từ std :: exception

throw My_Exception("Something bad happened."); 
+0

Tôi biết điều này không trả lời câu hỏi của bạn, nhưng bạn có thể muốn đọc [this] (http://www.codeproject.com/KB/cpp/cppexceptionsproetcontra.aspx) trước khi bạn bắt đầu sử dụng ngoại lệ. Ngoài ra còn có nhiều câu hỏi ở đây trên ngăn xếp tràn về ngoại lệ là tốt hay xấu (câu trả lời chủ yếu là xấu). – Shahbaz

Trả lời

38

Nếu bạn muốn sử dụng của hàm tạo chuỗi, bạn nên kế thừa từ std::runtime_error hoặc std::logic_error thực hiện một hàm tạo chuỗi và triển khai std :: exception :: phương thức nào.

Sau đó, nó chỉ là một trường hợp gọi hàm khởi tạo runtime_error/logic_error từ lớp kế thừa mới của bạn hoặc nếu bạn đang dùng C++ 11, bạn có thể sử dụng hàm tạo kế thừa.

4

Phương thức what là ảo và ý nghĩa là bạn nên ghi đè lên để trả lại bất kỳ thư nào bạn muốn trả lại.

+24

bạn có nghĩa là ghi đè? – smallB

+0

Không có quá tải ... – Hydro

5

Làm thế nào về điều này:

class My_Exception : public std::exception 
{ 
public: 
virtual char const * what() const { return "Something bad happend."; } 
}; 

Hoặc, tạo một constructor chấp nhận mô tả nếu bạn thích ...

+1

@ user472155 +1 cho câu trả lời hay. Mặc dù vậy, tôi nghĩ rằng nó đáng nói đến ở đây, rằng chữ ký bạn đã cung cấp trong ví dụ của bạn cho hàm nào, chỉ ngụ ý đến mã trước C++ 11. –

44

tôi sử dụng lớp sau cho trường hợp ngoại lệ của tôi và nó hoạt động tốt:

class Exception: public std::exception 
{ 
public: 
    /** Constructor (C strings). 
    * @param message C-style string error message. 
    *     The string contents are copied upon construction. 
    *     Hence, responsibility for deleting the char* lies 
    *     with the caller. 
    */ 
    explicit Exception(const char* message): 
     msg_(message) 
     { 
     } 

    /** Constructor (C++ STL strings). 
    * @param message The error message. 
    */ 
    explicit Exception(const std::string& message): 
     msg_(message) 
     {} 

    /** Destructor. 
    * Virtual to allow for subclassing. 
    */ 
    virtual ~Exception() throw(){} 

    /** Returns a pointer to the (constant) error description. 
    * @return A pointer to a const char*. The underlying memory 
    *   is in posession of the Exception object. Callers must 
    *   not attempt to free the memory. 
    */ 
    virtual const char* what() const throw(){ 
     return msg_.c_str(); 
    } 

protected: 
    /** Error message. 
    */ 
    std::string msg_; 
}; 
+0

từ khóa "msg_" xuất phát từ đâu? Tôi không biết bạn có thể gọi câu lệnh sau ":" của khai báo phương thức. Tôi nghĩ điều này chỉ dành cho lớp cơ sở. – Nap

+1

msg_ là thành viên ** ngoại lệ ** được bảo vệ **; nó là một thể hiện của std :: string, do đó nó có quyền truy cập vào hàm thành viên .c_str của nó (chuyển thành chuỗi c). – MattMatt

+1

điều gì về bản sao của nhà xây dựng? – isnullxbh

Các vấn đề liên quan