2012-08-17 6 views
7

特定のエラーが発生した場合に例外をスローし、その場合にオブジェクトを返す必要があります。エラーを返して例外をスローする

だから私はこのような何かをしたい:リターンがスローされることから例外を防ぐことができますよう

if(error) 
return obj; 
throw new FaultException(string.Format("Error found with ID={0}", ID)) 

これは、明らかに動作しません。

誰もがこれを実現する最良の方法を提案できますか?何とか例外にオブジェクトを渡すことはできますか?

おかげで、いくつかの方法の文脈では

+4

例外の場合に何らかのオブジェクトを返すのはなぜですか? –

+0

実装しているメソッドのシグネチャを表示してください。 –

答えて

8

通常、すべてのデータを含む独自の例外クラスを作成します。しかし、WCFを意味するFaultExceptionが表示されています。そのためにはすでにFaultException<T>があります。

6

、例外をスローし、結果を返すには、相互に排他的なものです。

あなたは追加の情報をクライアントコードを提供したいのであれば、あなたは、カスタムプロパティでカスタム例外Exceptionクラスから派生)を実装することができます。

[Serializable] 
public class MyException : Exception 
{ 
    public MyCustomObject CustomObject { get; private set; } 

    public MyException(MyCustomObject customObject) 
    { 
     CustomObject = customObject; 
    } 

    public MyException(string message, MyCustomObject customObject) 
     : base(message) 
    { 
     CustomObject = customObject; 
    } 

    public MyException(string message, Exception inner, MyCustomObject customObject) 
     : base(message, inner) 
    { 
     CustomObject = customObject; 
    } 

    protected MyException(
     SerializationInfo info, 
     StreamingContext context) 
     : base(info, context) 
    { 
     // TODO: Implement serializable stuff. 
    } 

    #region Overrides of Exception 

    public override void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     // TODO: Implement serializable stuff. 
     base.GetObjectData(info, context); 
    } 

    #endregion 
} 

今すぐスローすることができます。

throw new MyException(obj); 
4

オブジェクトを返して例外をスローすることはできません。それがあなたの要求であれば、私はそれを改訂しようと提案します。

しかし、あなたは正しい方向に向いていると思いますが、リターンオブジェクトを含む例外があります。例外をキャッチし、それから "返された"値を取得します。

編集:throwing exception vs returning error codeに関する非常に興味深い議論がありました。見てみな。私はまだあなたがどちらかと一緒に行くのが良いと思う。

0

エクステンションからコンテキストを取得する場合は、Exception.Dataの中に配置するか、独自の例外クラスを作成してメンバーを追加します(例外をシリアル化する必要がある場合は、より効果的です)。

しかし、コードをリファクタリングしたり、要件を再考して、これをまったく行う必要がないようにすると、コンテキストなしではわかりません。

0

あなたはどんなタイプobj例外プロパティを追加することができますし、(1がスローされた場合)に関連する例外でobjを返すと、このメソッドの呼び出し元のコードで例外が存在することを確認するか、どこにあなたがいますobjをに返します。

少しばかりですが、説明した設定に合っている可能性があります。

関連する問題