2016-04-26 5 views
1

"Shapes library"プログラムのようなものを書いてみたい。с++シェイプライブラリの例外処理

コードを大量に書くのではなく、抽象基底クラスのShapeとLine、Rectangle、Circleなどの派生クラスがいくつかあるとしましょう(私はそれを記述することはあまり重要でないと思います)。

主な機能は次のようなものになることを考慮:私は(形状が画面範囲外にある場合)、コンストラクタにまたは多分移動した後にスローされる可能性がある例外を処理する方法

int main() { 

    Shape *rect = new Rectangle(Pixel(25, 10), Pixel(33, 15)); 
    Shape *line = new Line(Pixel(1, 12), Pixel(23, 12)); 
    Shape *circle = new Circle(Pixel(37, 12), 2); 
    refresh_shapes(); // just draw every created shape 
    cin.get(); 

    rect->rotate_left(); 
    refresh_shapes(); 
    cin.get(); 

    rect->move(45, 12); 
    refresh_shapes(); 
    cin.get(); 

    line->up(rect); // place the line right above the rect 
    refresh_shapes(); 
    cin.get(); 

    circle->down(); 
    refresh_shapes(); 
    cin.get(); 

    return 0; 
} 

たとえば、コード全体を1つのtry-catchブロックにラップすると、例外がスローされる前に発生したすべての情報が画面に表示されます。しかし、私は可能な限り「保存」したい。 try-catchブロックのほとんどすべての行を折り返すよりも優れたソリューションがありますか?

ご迷惑をおかけして申し訳ありませんが、それがどのように機能しているか理解したいと思います。

+1

例外的ではないが、オブジェクトを使用する通常の機能として発生することが予想される些細な失敗に対しては、例外をスローしないでください。 – Galik

答えて

1

例外ではないが、オブジェクトを使用する通常の機能として発生すると思われる些細なエラーに対しては、例外をスローしないでください。

ここで、線を引く部分は判断の問題です。私たちの何人かはまだそれを学んでいます!

メモリが足りなくなった場合にオブジェクトを作成すると、今後のすべての割り当ても失敗する可能性があるため、例外が正しく発生します。しかし、オブジェクトが単に画面領域に配置されていない場合は、単にオブジェクトを表示することができません。

本当に例外的なエラー(ローカルで回復不能なエラー)と予想される動作の一部であり、すぐに回復可能な通常のエラーの間には、バランスをとる必要があります。

このようにして、すべての呼び出しをtry/catchでラップすることはできませんが、関数を呼び出すたびにすべてのエラーをチェックする必要はありません。

+0

返信いただきありがとうございます!何か間違ったものがコンストラクタに渡された場合、std :: invalid_argument例外のようなものはどうですか? –

+0

@ArtemAlievコンストラクタ**は**オブジェクトを有効な状態にする必要があります。そのため、不正な引数は例外をスローする必要があります。あなたのプログラムが悪い状態にあることを示しています(その値はどうやって悪くなったのですか?)したがって、悪い議論は本当に例外的で、(ローカルで)回復できないはずです。つまり、複数のコンストラクタを持つことができ、例外を発生させないデフォルトのコンストラクタを持つことを目指すべきだと思います(また、 'noexcept'とマークされます)。次に、あなたのオブジェクトを構築し、そのインタフェースを介して必要な値を与えることができます。 – Galik