2010-09-10 31 views
6

Tôi đang cố gắng làm một runtime_error tùy chỉnh đơn giản. Tôi xác định các lớp:Làm cách nào để tạo lớp lỗi thời gian chạy tùy chỉnh của riêng tôi?

#include <string> 
#include <stdexcept> 


namespace utils{ 

class FileNotFoundException: public std::runtime_error{ 
    public: 
    FileNotFoundException():runtime_error("File not found"){} 
    FileNotFoundException(std::string msg):runtime_error(msg.c_str()){} 
}; 

}; 

Sau đó, tôi ném lỗi:

bool checkFileExistence(std::string fileName) 
{ 
    boost::filesystem::path full_path = boost::filesystem::system_complete(boost::filesystem::path(fileName)); 
    if (!boost::filesystem::exists(full_path)) 
    { 
    char msg[500]; 
    _snprintf(msg,500,"File %s doesn't exist",fileName.c_str()); 
    throw new FileNotFoundException(msg); 
    } 
} 

Và tôi sử dụng một khối try/catch

try{ 
      checkFileExistence(fileName); 
    } 
    catch(utils::FileNotFoundException& fnfe) 
     { 
      std::cout << fnfe.what() << std::endl; 
    } 

Runtime lỗi được ném một cách chính xác như FileNotFoundException nhưng dòng với std :: cout là không bao giờ đạt được và không có dòng được ghi vào giao diện điều khiển.

Tất cả các ý tưởng đều được chào đón. Cảm ơn!

+0

Bạn có thể muốn sử dụng đối số mặc định thay vì ghi đè trong lớp ngoại lệ của mình. –

Trả lời

13

Đó là vì bạn đang ném một con trỏ. Chỉ cần làm: throw FileNotFoundException(msg);.

Bất cứ khi nào bạn sử dụng con trỏ, trừ khi bạn đặt nó vào một thùng chứa/trình bao bọc, có thể bạn không làm đúng.

5

Bạn viết throw new FileNotFoundException(msg), nó phải là 'ném FileNotFoundException (msg)'. Quy tắc được ném theo giá trị, bắt theo tham chiếu.

+1

Trừ khi bạn đang Microsoft với MFC, sau đó quy tắc được ném bằng con trỏ và bắt bằng con trỏ. Họ đã tạo ra các lớp ngoại lệ của mình trước khi họ có hỗ trợ đầy đủ cho ném/ném tiêu chuẩn, dẫn đến một vài thỏa hiệp thú vị. –

3

Bạn đang thực sự ném con trỏ đến đối tượng được phân bổ heap (FileNotFoundException *) để các loại không khớp. Nói chung, ném theo giá trị và bắt theo tham chiếu (rule 73).

1

BTW, với tuyên bố sau bạn tạo bản sao của chuỗi thông điệp.

FileNotFoundException(std::string msg):runtime_error(msg.c_str()){} 

Viết "const std :: string & msg" thay thế. Nó sẽ đặt chỉ là một tài liệu tham khảo trên một ngăn xếp. Trong khi bây giờ bạn đặt toàn bộ chuỗi trên một ngăn xếp.

+0

Đã sửa! Cảm ơn ý tưởng! – Killrazor

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