質問: read(); if( !result ) { log.debug() << "failed read" << result.exception(); return false; //or again return a result } dosomething( *result ); または「例外」スタイル:try { dosomething( *read() ); } catch( const std::exception& e ) { //do what's needed } または、readからの例外を処理する方法がわからないと判断し、呼び出し元にそれを処理させるdosomething( *read() ); //throws if !result これは一般的に良いアイデアのように思えますか、そして既存のc++コードで使用されている同様の原則はありますか?それとも、現時点では見られない深刻な欠点はありますか?オプションが多すぎるため、またはc++で使用される一般的なシステムではないために、ユーザーにとっては複雑すぎるのでしょうか。
回答: 特に、例外のスローとエラーオブジェクトの返却には大きな違いがあります。 例外は、ソースコードでは明示的に表示されない多くの新しいコードフローパスを作成します。 呼び出し元は、どのようなエラーが発生する可能性があるかわからない、 それらは自動的に伝播し、 これにより、コードが非常に簡潔になり、読み書きしやすくなります。 rustは、例外を禁止することで(これにより最初の2つのポイントが排除され)、try!マクロを持つことで(これは自動伝播と冗長性を扱います)、両方の世界を最大限に活用しようとします。ソリューションは最初の2つのポイントのみを扱い、後の2つを簡単に設定する方法はありません。 *演算子はtry!と同等ではありません。同等のものx = try!(foo()); c ++では(言語拡張なしでは)不可能です。つまり、クラスを自由に使用してください。ただし、@ deduplicatorが指摘しているように、resultクラスは動的型std::exceptionの例外オブジェクトしか保持できません。これは、おそらく意図したものではありません。あなたが望むことを達成する最も簡単な方法は、std::exception_ptrを使用して例外オブジェクトを保持することです。または、さらに良いことに、例外を使用するだけです-結局のところ、それは言語がそのために設計されたものです。