プロジェクトを開始していますが、ファイル入力処理中のエラー処理のベスト プラクティスについて疑問に思っています。プロジェクトの現在の計画には、次のようなプロセスが含まれますmain
。
unique_ptr<Configuration> config(initConfig(argc,argv));
unique_ptr<InterfaceA> a(initA(config));
// Do real work here
Configuration クラスと他のすべてのクラスの初期化データは、次のような入力ファイルのヘッダーに含まれます。
#ObjectA-1
はObjectA
、 を満たすオブジェクトに変換されることを意図したファイルがあることを教えてくれます。InterfaceA
また、1
は、そのインターフェイスのどの特定の実装を使用するかを教えてくれます。
私の質問は、initConfig
やなどの関数のエラー処理ですinitA
。これらの関数内で、それぞれのファイルの最初の行を解析し、上記の情報をデコードします。たとえば、initA
たまたま適切なヘッダーがないファイルを取得した場合#ObjectB-3
、またはヘッダーがまったくない場合です。エラーを処理するには、次の 2 つの方法があります。
メインでキャッチされる例外をスローします。これにより、エラーを出力し、エラー フラグを介して他の init 関数をバイパスし、必要な高レベルのクリーンアップを行うことができます。これの悪い点は、
main
ほとんどが例外処理で構成されているため、コードが読みにくくなっているということです。init 関数内からエラーを
exit(EXIT_FAILURE)
出力し、OS を呼び出して依存して、以前に割り当てられたメモリのクリーンアップを行います。これにより、コードがよりクリーンになり、よりローカルなエラー処理が可能になります。
exit
個人的には、関数 を使用しない場合は 2 番目の方が好みです。