1

私はあなたの助言が必要です。私のソースアプリケーションは非常に大きくなりました。そして、私はエラー、例外などを扱う少し問題があります。例外、エラー、戻り値の処理に関する問題

たとえば、私は "DatabaseProvider"クラスはどこにデータベースと連絡するメソッドがあります。私は標準の例外、無効なデータフォームデータベース(例えば、間違った電子メールフォーマット)、データベースから返されたエラーに対処しなければならない。私がDatabaseProviderのメソッドを呼び出した関数に戻るために必要なすべてのもの。そのメソッドはこの例外またはエラーを記録し、それでも動作します。だから私は例外をスローすることはできません。

これで十分でない場合は、(DatabaseProviderから)ほとんどの場合、オブジェクトまたはオブジェクトのリストの値を返さなければなりません。

私は、おそらくクラス "レスポンス"を作成すると考えました。そしてそのクラスのオブジェクトは私のアプリのすべてのメソッドから返されます。そのような

Sthを:

​​

しかし、どのように(例えば)を返すために、同じ時間内に自己のデザインオブジェクトのリスト?

"out"パラメータを使用するのは解決策ですか?最良の方法(ベストプラクティス)は何ですか?私はそれについて調べていましたが、私が見つけたのは例外を処理する方法だけでした..

+1

カスタム例外を実装したくない理由はありますか?何か問題が起きたときだけでなく、いつもこの情報を返すことを目指していますか?あなたの例から、それは非常にエラーを中心に見える –

答えて

3

この情報を返すのではなく、スローしてキャッチできるカスタムExceptionを実装することをお勧めします非常にエラーに固有です。

あなたが常に返される結果に特定のメタ情報を付加したい場合は、あなたがメタ情報を運んでいる間、結果をラップする小型車両のクラスを実装するかもしれません:

abstract class ResultWrapper 
{ 
    //meta info, such as error references/properties/flags/statistics 

    public ResultWrapper([meta info]) 
    { 
     //set meta info 
    } 
} 

class ResultList<T> : ResultWrapper 
{ 
    public readonly List<T> resultList; 

    //constructor for resultList, plus meta information for parent 
    public ResultList(List<T> resultList, [additional args for meta info]) : base([meta info]) 
    { 
     this.resultList = resultList; 
    } 
} 

class SingleResult<T> : ResultWrapper 
{ 
    public readonly T result; 

    //constructor similar to above 
} 

編集:あなたのコメントに基づいて、あなたは間違いなくあなたが投げることができるカスタムの例外と一緒に行かなければなりません(可能性のあるラッピング原因の例外)。 Petarが述べたように、これらはループ内で捕らえられ、後続のタスクの実行を停止することなくそこで処理されます。言語は良い理由のために例外処理をサポートします - 私はそれを利用します。

また、FYIあなたのパターンで:

public bool Error { get; set; } 
public string ErrorMessage { get; set; } 

boolは必要ありません。エラーメッセージ/参照フィールドでnull以外をチェックしてください

+0

まあ、それは例外をスローしていないわけではありません。私はしますが、エラーが発生したときにはログを残したいが、依然として値を返す状況があります。 2番目の理由はタイマーループの問題です(私はPetar Ivanovの答え – Marshall

+0

にコメントしていますが、とにかく、メタ情報で価値を返すのは良いプログラミング方法ですか?それは人気がありますか?めったにそれは良い解決策ではありません。私は再びそれについて考える必要があります – Marshall

+0

@マーシャル上記の編集を参照してください –

4

例外の場合に渡す必要があるすべてのデータを含むカスタム例外を実装します。何かのように

public class MySpecificException: Exception 
{ 
    public bool Error { get; set; } 
    public string ErrorMessage { get; set; }   
    public bool DatabaseError { get; set; } 
    public string DatabaseMessage { get; set; } 

    public Exception ex { get; set; } 
} 

あなたは例外をスローし、あなたの特定の例外のためにtry catchブロックを使用します。

public void CallingFunction() 
{ 
    try { 
     //call your function 
    } 
    catch (MySpecificException ex) 
    { 
     //log the data from the exception 
    } 

これはまさにカスタム例外の対象です。

このようにして、関数から返すもの(リストなど)を返すことができます。

+0

私は知っていますが、 私は多くのタスクを取得し、それらを1つずつ実行するタイマーループを持っています。今、ランダムなタスクが失敗すると、 - >私は例外をスローします。例外はタイマーティックを打ち切り、キュー内の残りのタスクは実行されません。 単一のタスクが失敗した場合は、そのタスクをログに記録しますが、残りのタスクは続行します。私は何が起こったのかについてeverythinkを記録したい。 – Marshall

+0

よく、呼び出し元関数で例外をキャッチする - 何も中止されるだろう:) –

+0

したがって、タイマーのループ全体がtry catch(Exception ex)になります。内部には別のtry catch(MyException myex)ブロックがありますが、この秒の中には "Execute"機能のみがあります。 catch(MyException myex)では、失敗した場合にすべてのものをログに記録します。私はもう一度それについて考える必要がありますが、それは良いと思います。 – Marshall

関連する問題