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ý và 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ì?
[Đã xác nhận] (http://coliru.stacked-crooked.com/a/81a72462c322e96f) –
Có thể có liên quan: http://stackoverflow.com/questions/35088800/what-effect-would-lwg2349-have/35089910 # 35089910 –
Hoạt động như mong đợi với g ++ 5.4.0 –