ifstream f;
f.open(fileName);
if ( f.fail() )
{
// I need error message here, like "File not found" etc. -
// the reason of the failure
}
Bagaimana cara mendapatkan pesan kesalahan sebagai string?
c++
error-handling
stream
std
Alex F
sumber
sumber
cerr << "Error code: " << strerror(errno); // Get some info as to why
sepertinya relevan dengan pertanyaan itu.strerror(errno)
bekerja. Posting ini sebagai jawaban, saya akan menerimanya.Jawaban:
Setiap panggilan sistem yang gagal memperbarui
errno
nilai.Dengan demikian, Anda dapat memperoleh lebih banyak informasi tentang apa yang terjadi ketika
ifstream
pembukaan gagal dengan menggunakan sesuatu seperti:Namun, sejak itu setiap panggilan sistem memperbarui nilai globalerrno
, Anda mungkin mengalami masalah dalam aplikasi multithread, jika panggilan sistem lain memicu kesalahan antara eksekusif.open
dan penggunaanerrno
.Pada sistem dengan standar POSIX:
Sunting (terima kasih kepada Arne Mertz dan orang lain di komentar):
e.what()
tampaknya pada awalnya lebih C ++ - cara yang secara idiomatis benar untuk mengimplementasikan ini, namun string yang dikembalikan oleh fungsi ini bergantung pada implementasi dan (setidaknya dalam libstdc ++ G ++) string ini tidak memiliki informasi yang berguna tentang alasan di balik kesalahan ...sumber
e.what()
sepertinya tidak memberikan banyak informasi, lihat update jawaban saya.errno
menggunakan penyimpanan lokal-utas pada sistem operasi modern. Namun, tidak ada jaminan bahwafstream
fungsi tersebut tidak akan terhentierrno
setelah terjadi errno. Fungsi yang mendasari mungkin tidak diaturerrno
sama sekali (panggilan sistem langsung di Linux, atau Win32). Ini tidak berfungsi pada banyak implementasi dunia nyata.e.what()
selalu mencetak pesan yang sama "iostream stream error
"warning C4996: 'strerror': This function or variable may be unsafe. Consider using strerror_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\string.h(168) : see declaration of 'strerror'
Anda dapat mencoba membiarkan aliran mengeluarkan pengecualian jika gagal:
e.what()
, bagaimanapun, sepertinya tidak terlalu membantu:strerror(errno)
memberikan "Tidak ada file atau direktori seperti itu."Jika
e.what()
tidak berhasil untuk Anda (saya tidak tahu apa yang akan dikatakannya tentang kesalahan tersebut, karena itu tidak terstandarisasi), coba gunakanstd::make_error_condition
(hanya C ++ 11):sumber
strerror(errno)
diposting di komentar berfungsi dan sangat mudah digunakan. Saya pikir itue.what
akan berhasil, karenaerrno
berhasil.e.what()
akanstrerror
kembali, dengan cara yang aman untuk thread. Keduanya mungkin bergantung pada platform.exception.what()
. Semoga menjadi kesempatan yang baik untuk mempelajari kode sumber libstdc ++ :-)basic_ios::clear
, tidak ada yang lain. Ini tidak terlalu membantu. Itu sebabnya saya tidak memposting;)Mengikuti jawaban @Arne Mertz, mulai C ++ 11
std::ios_base::failure
mewarisi darisystem_error
(lihat http://www.cplusplus.com/reference/ios/ios_base/failure/ ), yang berisi kode kesalahan dan pesan yangstrerror(errno)
akan dikembalikan.Ini mencetak
No such file or directory.
jikafileName
tidak ada.sumber
iostream stream error
.iostream error
. Pada kompiler apa Anda menguji ini? Apakah ada kompilator yang benar-benar memberikan alasan kegagalan yang dapat dibaca pengguna?unspecified iostream_category error
.Anda juga bisa melempar
std::system_error
seperti yang ditunjukkan pada kode tes di bawah ini. Metode ini tampaknya menghasilkan keluaran yang lebih mudah dibaca daripadaf.exception(...)
.Contoh keluaran (Ubuntu w / clang):
sumber