2011-01-31 2 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

예외가 발생하면 즉시 방법이 종료됩니다.
값을 반환 할 방법이 없습니다.

예외를 throw하는 메서드를 호출하면 컨트롤이 즉시 catch 블록으로 전송됩니다.
(존재하지 않는) 반환 값을 관찰하거나 사용할 기회가 없습니다.

디자인을 다시 생각해보십시오.

+0

를 호출하지합니다 질문에 명시된 바와 같이 반환 값 (try code path에서) – RichardTheKiwi

+0

반환 값을 사용할 필요가없는 경우 왜 반환합니까? 그냥 예외를 다시 던져. 만약 당신이 * 정말로 * 필요하다면, 당신은 두 개의 인자, 실제 예외와 원하는 리턴 값을 가지는 당신 자신의 래퍼 예외를 만들 수있다. 그러나 그것은 무시 무시하다. –

+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 datetime -declaration을 try-catch-block 외부로 전송해야하고 SLaks가 옳다면 말이 될 것입니다. datetime은 return-Statement가 catch 된 예외를 throw하는 경우에만 의미있는 내용을 포함 할 수 있습니다. 다른 경우 유용한 응용 프로그램이있을 수 있습니다.

편집 : 동일한 문자열을 사용하여 수행 할 수 있지만 현재 시간을 반환하면 상황을 좋은 방법으로 해결할 경우이를 예외로 다시 제기하려면 다소 바보 스럽습니다. 위에서 언급 한 것처럼 제대로 읽지 못했습니다.

+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'을 Nullable 타입으로 바꾼다. '?'가 의미하는 것. [documentation] (http://msdn.microsoft.com/en-us/library/1t3y8s4s.aspx)에서 : "문법'T? 'Nullable의 줄임말입니다.', 여기서'T '는 값 유형입니다. 두 형태는 상호 교환이 가능합니다. " –

관련 문제