Pertanyaan Dapatkan std :: fstream failure error messages dan / atau pengecualian


Saya menggunakan fstream. Adakah cara untuk mendapatkan pesan / pengecualian kegagalan?

Misalnya jika saya tidak dapat membuka file?


32
2018-05-08 12:48


asal


Jawaban:


Streaming secara default tidak melemparkan pengecualian pada kesalahan, mereka mengatur bendera. Anda dapat membuat mereka membuang pengecualian dengan menggunakan fungsi anggota pengecualian () anggota:

ifstream ifs;
ifs.exceptions( std::ios::failbit );   // throw if failbit get set

Secara teoritis, Anda bisa melakukan hal seperti ini:

try {
  int x;
  ifs >> x;
}
catch( const std::exception & ex ) {
   std::cerr << "Could not convert to int - reason is " 
                  << ex.what();
}

Sayangnya, C ++ Standard tidak menentukan bahwa pengecualian yang dibuang mengandung pesan kesalahan apa pun, sehingga Anda berada dalam wilayah khusus implementasi di sini.


30
2018-05-08 13:03



Jawaban singkat: tidak. Bahkan mengecek errno setelah Anda mendeteksi kegagalan (menggunakan misalnya bad(), fail()) setelah berbagai operasi tidak dapat diandalkan bekerja. Menciptakan sebuah ifstream/ofstream membungkus file yang tidak dapat dibuka tidak selalu menetapkan kegagalan sampai Anda mencoba membaca, menulis, atau menutupnya.

Jawaban panjang: Anda dapat menelepon ios::exceptions(ios_base::iostate) untuk memintanya ios_base::ios_failure pengecualian akan dilempar ketika bit yang sesuai (badbit, failbit, eofbit) diset, tetapi ini (setidaknya pada GNU dan Microsoft C ++ libraries) tidak memberi Anda informasi lebih banyak daripada secara manual memeriksa bit, dan akhirnya menjadi tidak berguna, MENURUT OPINI SAYA.


9
2018-05-08 13:05



Dari mengeceknya saya menemukan itu juga errno dan juga GetLastError() lakukan mengatur kesalahan terakhir dan memeriksa mereka cukup membantu. Untuk mendapatkan penggunaan string pesan:

strerror(errno);

2
2018-05-16 18:19