2012-04-26 60 views
7

Cố ý Tôi đang gặp phương pháp này mà viết vào một tập tin, vì vậy tôi đã cố gắng để xử lý các ngoại lệ của possiblity rằng tôi đang viết vào một tập tin đóng:ofstream xử lý ngoại lệ

void printMe(ofstream& file) 
{ 
     try 
     { 
      file << "\t"+m_Type+"\t"+m_Id";"+"\n"; 
     } 
     catch (std::exception &e) 
     { 
      cout << "exception !! " << endl ; 
     } 
}; 

Nhưng dường như std: : ngoại lệ không phải là ngoại lệ thích hợp cho một lỗi tệp đóng vì tôi đã cố gắng sử dụng phương thức này trên một tệp đã đóng nhưng nhận xét "exception !!" của tôi không được tạo ra.

Vậy tôi nên viết ngoại lệ nào?

Trả lời

12

Luồng không loại trừ ngoại lệ theo mặc định, nhưng bạn có thể yêu cầu chúng loại bỏ ngoại lệ bằng lệnh gọi hàm file.exceptions(~goodbit).

Thay vào đó, theo cách thông thường để phát hiện lỗi đơn giản là để kiểm tra trạng thái của dòng:

if (!file) 
    cout << "error!! " << endl ; 

Lý do cho điều này là có rất nhiều tình huống phổ biến nơi một đọc không hợp lệ là một vấn đề nhỏ, không phải là một chính một:

while(std::cin >> input) { 
    std::cout << input << '\n'; 
} //read until there's no more input, or an invalid input is found 
// when the read fails, that's usually not an error, we simply continue 

so với:

for(;;) { 
    try { 
     std::cin >> input; 
     std::cout << input << '\n'; 
    } catch(...) { 
     break; 
    } 
} 

Xem nó sống: http://ideone.com/uWgfwj

+0

Tôi đã cố gắng làm quen với xử lý ngoại lệ nhưng thật tuyệt khi biết rằng "Luồng không loại trừ ngoại lệ theo mặc định", cảm ơn rất nhiều – Glolita

4

ngoại lệ của các loại ios_base::failure, Tuy nhiên lưu ý rằng bạn phải đặt cờ thích hợp với ios::exceptions để tạo ra các trường hợp ngoại lệ hoặc cờ trạng thái khác chỉ nội bộ sẽ được thiết lập để chỉ ra các lỗi, đó là hành vi mặc định cho luồng.