2014-10-02 16 views
7

Làm cách nào để bảo vệ bản thân khỏi việc sử dụng đối tượng không được tạo hoàn toàn khi sử dụng ngoại lệ? Tôi có nên bắt người xây dựng không? Hoặc có thể đó là thực hành xấu? Nếu tôi bắt được đối tượng constructor sẽ được tạo.C++ bắt ngoại lệ trong hàm tạo

#include <stdio.h> 

class A 
{ 
public: 
    A() 
    { 
     try { 
      throw "Something bad happened..."; 
     } 
     catch(const char* e) { 
      printf("Handled exception: %s\n", s); 
     } 
     // code continues here so our bad/broken object is created then? 
    } 
    ~A() 
    { 
     printf("A:~A()"); 
    } 

    void Method() 
    { // do something 
    } 
}; 

void main() 
{ 
    A object; // constructor will throw... and catch, code continues after catch so basically we've got 
       // broken object. 

    //And the question here: 
    // 
    //* is it possible to check if this object exists without catching it from main? 
    // &object still gives me an address of this broken object so it's created but how can I protect myself 
    // from using this broken object without writing try/catch and using error codes? 
    object.Method(); // something really bad. (aborting the program) 

}; 
+0

Tại sao bạn đặt các hạn chế hoàn toàn tùy ý cho chính mình? –

Trả lời

9

Bản thân ngôn ngữ không có khái niệm về đối tượng là "không hợp lệ" theo bất kỳ cách nào có thể phát hiện được.

Nếu ngoại lệ chỉ ra rằng một đối tượng hợp lệ không thể được tạo, thì nó không được xử lý trong hàm tạo; hoặc là rethrow nó, hoặc không bắt nó ở nơi đầu tiên. Sau đó, chương trình sẽ để lại phạm vi của đối tượng đang được tạo và sẽ không thể truy cập không chính xác vào đối tượng đó.

Nếu đó không phải là một tùy chọn vì lý do nào đó, thì bạn sẽ cần cách riêng để đánh dấu đối tượng là "không hợp lệ"; có lẽ thiết lập một biến thành viên boolean ở cuối constructor để cho biết sự thành công. Điều này là dễ vỡ và dễ bị lỗi, vì vậy đừng làm điều đó trừ khi bạn có một lý do rất tốt.

+0

Cảm ơn, đây là những gì tôi muốn biết. – user3841735

2

Nếu đối tượng ở trạng thái không hợp lệ khi có ngoại lệ nhất định, tôi sẽ để cho người gọi có thể được thông báo (và do đó phản ứng) với những thứ như vậy.

Tuy nhiên, nếu ngoại lệ là một trong những trường hợp bạn có thể khôi phục, có thể đáng để làm như vậy tùy thuộc vào đơn đăng ký của bạn. Hãy chắc chắn rằng bạn sử dụng một cái gì đó giống như một logger hoặc thậm chí chỉ đơn giản là stderr để cho biết điều này đang xảy ra mặc dù.

1

Tôi sẽ đề nghị một lần lặp đầu tiên làm một cái gì đó như thế này:

try { 
     throw "Something bad happened..."; 
    } 
    catch(const std::exception e) { 
     cerr << e.what() << endl ; // Better off in the main 
     throw ; 
    } 

Hai điều ở đây:

  1. Trừ khi xử lý ngoại lệ của bạn xử lý ngoại lệ, nó nên ném.

  2. Luôn sử dụng các lớp ngoại lệ dựa trên std :: ngoại lệ để bạn luôn có thể tìm hiểu vấn đề như được hiển thị ở trên.

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