Saya mencoba meyakinkan pimpinan tim saya untuk mengizinkan menggunakan pengecualian dalam C ++ alih-alih mengembalikan bool isSuccessful
atau enum dengan kode kesalahan. Namun, saya tidak bisa melawan kritiknya ini.
Pertimbangkan perpustakaan ini:
class OpenFileException() : public std::runtime_error {
}
void B();
void C();
/** Does blah and blah. */
void B() {
// The developer of B() either forgot to handle C()'s exception or
// chooses not to handle it and let it go up the stack.
C();
};
/** Does blah blah.
*
* @raise OpenFileException When we failed to open the file. */
void C() {
throw new OpenFileException();
};
Pertimbangkan pengembang memanggil
B()
fungsi. Dia memeriksa dokumentasinya dan melihat bahwa itu tidak menghasilkan pengecualian, jadi dia tidak mencoba menangkap apa pun. Kode ini dapat menyebabkan crash program dalam produksi.Pertimbangkan pengembang memanggil
C()
fungsi. Dia tidak memeriksa dokumentasinya jadi tidak menangkap pengecualian. Panggilan tidak aman dan dapat menyebabkan crash program dalam produksi.
Tetapi jika kita memeriksa kesalahan dengan cara ini:
void old_C(myenum &return_code);
Pengembang yang menggunakan fungsi itu akan diperingatkan oleh kompiler jika dia tidak memberikan argumen itu, dan dia akan berkata "Aha, ini mengembalikan kode kesalahan yang harus saya periksa."
Bagaimana saya bisa menggunakan pengecualian dengan aman, sehingga ada semacam kontrak?
Either
/ Result
monad untuk mengembalikan kesalahan dengan cara yang dapat dikomposisikan dengan tipe aman