私の個人的な意見:どちらのアプローチにも用途があります。それは、状況が発生した理由、それを防ぐことができるかどうか、クライアントがそれを防ぐために何をすることができたかによって異なります。
サーバ:
method SetBalance(int balance)
{
// do something only if balance >= 0
}
クライアント:
myServer.SetBalance(balance);
ケース1:
状況は、どこか(サーバーまたはクライアント)のバグが原因でのみ発生します。例外をスローします。責任者にコードを修正させます。
ケース2:
外部依存関係から不正な入力を受け取った。クライアントは簡単に前提条件を確認できます。例外をスローします。クライアントがそれに不満を持っている場合は、クライアントにコードを修正させます。
if(balance>0)
myServer.SetBalance(balance);
else
//take appropriate action.
ケース3:
外部依存関係から不正な入力を受け取った。クライアントは前提条件を簡単に確認できませんでした。例:クライアントが文字列を解析する必要があります。これはサーバーの仕事です。ここで、サーバーが成功を返す必要があることは理にかなっています。
bool succeeded = myServer.SetBalance(balance);
if(!succeeded)
//take appropriate action.
私の答えを書き留めた後、私はそれがすべてこれに要約されることに気づきました:クライアントはメソッドSetBalanceを呼び出すためにtry-catchを使用する必要はないはずです。(これはバグなので、例外をキャッチしたり、前提条件を自分で確認したり、戻り値を調べたりしないでください)
これは関連する主題に関する良い読み物です:http://blogs.msdn.com/b/ericlippert/archive/2008/09/10/vexing-exceptions.aspx
編集:
ジョジョは良い点を述べています。失敗する可能性がある場合は、メソッドの名前をTrySetBalance()に変更します。