2011-01-31 13 views
4

次のコードでは、例外がスローされた場合、どのように値(DateTime.Now.ToString())を返すことができますか?例外を元に戻し、C#で値を返す方法は?

public string DateToString(int year, int month, int day) 
{ 
    try 
    { 
     DateTime datetime = new DateTime(year, month, day); 
     return datetime.ToString(); 
    } 
    catch (Exception) 
    { 
     //log error and rethrow 
     throw; 
    } 
} 

答えて

11

例外をスローすると、メソッドはただちに終了します。
値を返す方法はありません。

例外をスローするメソッドを呼び出すと、コントロールはただちにcatchブロックに転送されます。
(存在しない)戻り値を観察または使用する機会はありません。

デザインを再考する必要があります。

+0

を呼び出していません質問 – RichardTheKiwi

+0

に記載されている戻り値(try code path)戻り値を使用する必要がない場合は、それを返しますか?ただ例外を再スローします。本当に必要な場合は、2つの引数、実際の例外と望ましい戻り値を持つ独自のラッパー例外を作成することができますが、それは恐ろしいです。 –

+0

@Michael - コメントを再読します。私は、もし失敗した場合には、 'try部からの戻り値 'を使う必要がないことを意味しました。私はその質問を「日付を構成するにはパラメータが無効な場合」 - > datetime.nowを返す代わりに「エラー部分を再投げていることは、その動作の誤解に起因するものではないと思っています – RichardTheKiwi

1

実際に例外をスローするのはどういうことかと考えてください。あなたの関数の値を返したら、おそらくのどこかで使ってみたいでしょうか?

同様:

// Will a value be assigned to dateString, or will an exception be thrown? 
string dateString = DateToString(2011, 2, 29); 

あなたは、あなたがその値がdateStringに割り当てる、上記の例外的な場合にはDateToString値リターンにしたい場合は、右?しかし、あなたは例外で何をしたいですか?あなたは続行するかしないかのどちらかです。あなたはそれを両方向に持つことはできません。

1

編集:cyberkiwiは私がやったより良い質問を把握し、私はそれが読書のように悪い例を立たせていただきます。)


あなたはいつも自分の例外クラスを定義することができます

[Serializable()] 
public class OwnException : System.Exception 
{ 
    public readonly MaybeDateTime; 

    ... 
    public OwnException (string message, System.Exception inner) : base(message, inner) { maybe = null; } 
    public OwnException (string message, System.Exception inner, DateTime maybe) : base(message, inner) { MaybeDateTime = maybe; } 
} 

を投げてください(日時を割り当ててください)。

DateTime datetime -declarationをtry-catch-blockの外に転送する必要があります。この例では、SLaksは正しい:それは意味をなさないでしょう。 datetimeは、return-Statementがキャッチされた例外をスローする場合にのみ意味のあるものを保持できます。他の場合には、有用な用途があるかもしれない。

編集:同じことが文字列で行うことはできますが、現在の時刻を返すと状況を良い方法で解決した場合は、これを例外として再現することはやや馬鹿になります。上記のとおり、正しく読まなかった。

+0

@IanMは復帰したいと思います[tryブロック内の] datetimeインスタンスの値ではなく、現在のdatetime [DateTime.Now.ToString()]。 –

3

あなたの質問は誤って言われていると思います。ただ例外として返されるデフォルト値がほしいと思うようです。したがって

public string DateToString(int year, int month, int day) 
{ 
    try 
    { 
     DateTime datetime = new DateTime(year, month, day); 
     return datetime.ToString(); 
    } 
    catch (Exception exObj) 
    { 
     //log error 
     LogMyError(exObj); 
     return DateTime.Now.ToString(); 
    } 
} 
2

私はあなたがこのような方法でそれを行うお勧めします。

bool IsValidDateTime(int year, int month, int day, out DateTime result) 
    { 
     try 
     { 
      result = new DateTime(year, month, day); 
      return true; 
     } 
     catch (System.Exception ex) 
     { 
      result = DateTime.Now; // assign a value 
      return false; 
     } 
    } 

あなたは文字列をしたい場合は、念の戻り値がtrueであることを確認し、/利用を観察する必要

result.ToString(); 
+1

いいえ、あなたは 'DateTime? 'を返すべきです – SLaks

+1

DateTimeはnullを許容する型ではありません。あなたは例外のocurrを許可して呼び出し元に対処させることができますが、ユーザの入力を検証しているなら、TryParseパターンで検証する方が良いと思うでしょう。 – santiagoIT

+0

'?' 'DateTime'をヌル可能な型に変換します。これは'? 'の意味です。[documentation](http://msdn.microsoft.com/en-us/library/1t3y8s4s.aspx)から: "T? 'Nullableの省略形です'、ここで' T 'は値型です。 2つの形式は互換性があります。 " –

関連する問題