2016-08-29 15 views
8

Context

tôi có mã đơn giản này:ngoại lệ không được xử lý trên fstream mở

#include <iostream> 
#include <fstream> 
#include <system_error> 

int main(int argc, char *argv[]) { 
    std::ifstream file; 
    file.exceptions(std::ios::failbit | std::ios::badbit); 

    try { 
    file.open("a_file_does_not_exist.txt", std::ios::in); 
    file.close(); 
    } catch(const std::ios_base::failure& err) { 
    std::cerr << err.code() << std::endl; 
    return -1; 
    } 

    return 0; 
} 

Chỉ cần để hoàn thành, đây là biên dịch lệnh:

g++ -std=c++11 -g // ... 

Các phiên bản của trình biên dịch là g ++ (GCC) 6.1.1.

Nền tảng: arch-linux 4.7.2-1.


Vấn đề

Như bạn có thể tưởng tượng, các tập tin không tồn tại vì vậy các phương pháp file.open(...) sẽ ném một ngoại lệ. Vấn đề là khi tôi chạy mã ngoại lệ không được xử lýstd::terminate được gọi.

Điều kỳ lạ là kết quả:

terminate called after throwing an instance of 'std::ios_base::failure' 
    what(): basic_ios::clear 
Annullato (core dump creato) 

Như bạn có thể đọc, lớp ném là một std::ios_base::failure, nhưng bắt tôi là đúng lớp đó.

Câu hỏi của tôi là: tôi đang thiếu gì?

+4

[Đã xác nhận] (http://coliru.stacked-crooked.com/a/81a72462c322e96f) –

+0

Có thể có liên quan: http://stackoverflow.com/questions/35088800/what-effect-would-lwg2349-have/35089910 # 35089910 –

+4

Hoạt động như mong đợi với g ++ 5.4.0 –

Trả lời

-1

Tại sao bạn không chỉ sử dụng file.good()file.fail() để xử lý ngoại lệ. Nó sẽ hoạt động hoàn hảo cho những gì bạn đang cố gắng làm.