2012-07-04 9 views
0

간단하고 숙련 된 프로그래머에게 바보처럼 보이 더라도 제 수업이 강력하다는 것을 확인하고 싶습니다.간단한 방법으로 try-catch를 올바르게 사용하려면 어떻게해야합니까?

문자열 []을 허용하고 int []로 반환하는 아래에 작성된 메소드가 있다고 가정 해 보겠습니다.

public static int[] GetIntArrayFromStringArray(string[] stringArray) 
    { 
     int i = 0; 
     int[] ints = new int[stringArray.Length]; 
     foreach (var str in stringArray) 
     { 
      ints[i++] = (str != "" ? int.Parse(str) : 0); 
     } 
     return ints; 
    } 

try-catch를 사용하고 예외를 throw하는 가장 좋은 방법은 무엇입니까? try-catch를 사용하려고하면 범위에없는 변수에 문제가있는 것 같지만 stringArray가 null 인 오류를 잡으려고 try-catch에 있어야합니다.

아마도 이걸 사용해야합니까?

if (stringArray == null) //do something ... 

오류가 발생하면 어떻게해야할지 잘 모르겠지만 null int []를 반환하거나 예외를 throw합니까?

(나는 또한 int.Parse (캐릭터가) 실패하지 않는 것을 확인해야 - 난 그 하나는군요하지만이 시도-catch 블록에있을 수 있습니다 희망!)

로를 나는 이것들이 너무 많은 나쁜 습관을 갖기 전에 내가 지금 시도하고 올바른 것을 얻고 싶은 간단한 일이라고 말했다. 감사.

+1

사용 int.TryParse는() 대신에 .. – Tisho

+0

가 try 문 – JohnnBlade

+0

@AlexR 위의 변수를 선언, 무엇을 비싼 메모리를 현명하게 말하는거야? – Sisyphus

답변

0
public static int[] GetIntArrayFromStringArray(string[] stringArray) 
    { 
     if (stringArray == null) 
     { 
      throw new ArgumentNullException("stringArray"); 
     } 

     int count = stringArray.Length; 
     int[] ints = new int[count]; 
     for (int i = 0; i < count; i++) 
     { 
      int intValue; 
      ints[i] = int.TryParse(stringArray[i], out intValue) ? intValue : 0; 
     } 
     return ints; 
    } 
0

는 전체 코드

public static int[] GetIntArrayFromStringArray(string[] stringArray) 
{ 
    if (stringArray == null || stringArray.Length == 0) 
     throw new ArgumentNullException("string array is null or empty"); 

    int i = 0; 
    int[] ints = new int[stringArray.Length]; 
    foreach (var str in stringArray) 
    { 
     int nr = 0; 
     int.TryParse(str, out nr); 
     if (nr > 0) 
      ints[i] = nr; 
     i++; 
    } 
    return ints; 
} 
+0

을 수정했습니다. str이 "0"일 때 어떤 일이 발생합니까? 인덱스를 건너 뛰고 null로 두지 않습니까? – Sisyphus

1
  1. 은 StringArray가 null의 경우, 즉시 NullArgumentException을 던져에게 있습니다.
  2. 하면 변환을위한 간단한 뭔가 시도해보십시오

    반환 stringArray.Select (S => IntParseOrDefault (S, 0)) ToArray();. IntParseOrDefault 그냥 이렇게 있습니다

:

int IntParseOrDefault(string s, int defaultVal) 
{ 
    int i; 
    if (!int.TryParse(s, out i)) i = defaultVal; 
    return i; 
} 

당신은 문자열의 어떤이 유효한 다음 정수 대신 기본값을 사용하는 경우이 방법이 실패 할 경우 , 을 던졌습니다.TryParse이 실패하면 오류가 발생합니다.

public static int[] GetIntArrayFromStringArray(string[] stringArray) 
{ 
    int i = 0; 
    int[] ints = null; 
    try { 
     ints = new int[stringArray.Length]; 
     foreach (var str in stringArray) 
     { 
      ints[i++] = (str != "" ? int.Parse(str) : 0); 
     } 
    } 
    catch { 
     // Throw custom exception 
    } 
return ints; 
} 
+0

좋습니다. 그렇기 때문에 예외를 throw하지만 "try-catch"대신 구체적으로 수행하십시오. – Sisyphus

+0

@Syyphus 예,이 방법에는 try-catch 블록이 필요하지 않습니다. 불확실성이 없기 때문입니다 (예 : 데이터베이스 또는 네트워크 호출 등). 입력 내용의 유효성을 검사 할 수 있으며 유효하지 않은 경우 입력을 수락하거나 호출자에게 예외를 반환 할 수 있습니다. – McGarnagle

0

는 시도를 사용할 수있는 방법입니다. 그래서 당신의 클래스 사용자는이 예외를 잡을 수 있습니다.잘못된 입력에 대한 예외를 던져 .NET Framework의

+0

컴파일러가 이것을 좋아하지 않습니다 ... 오류 : 할당되지 않은 로컬 변수 'ints'사용 – Sisyphus

+0

@Syyphus - 답변 편집 –

0

나는 캐치 블록에서 사용자 정의 예외를 슬로우 : 캐치 - 여기

0
public static int[] GetIntArrayFromStringArray(string[] stringArray) 
    { 
     int i = 0; 
     int[] ints; 
     int num; 
     if (stringArray == null && stringArray.Length > 0) 
     { 
     ints = new int[stringArray.Length] 
     foreach (var str in stringArray) 
     { 
      if (string.IsNullOrEmpty(str) && int.TryParse(str, num)) 
      { 
      ints[i++] = num; 
      } 
     } 
     } 
     return ints; 
    } 
0

많은 방법 대신 부울 값을 반환 일반적으로 Try로 시작 비 던지는 대응을 보유하고 있습니다. 예를 들어, int.Parse의 경우, 당신은 int.TryParse를 호출 쉽게 시간을 가질 것, 예를 들면 :

public static int[] GetIntArrayFromStringArray(string[] stringArray) 
{ 
    int i = 0; 
    int[] ints = new int[stringArray.Length]; 
    foreach (var str in stringArray) 
    { 
     int a = 0 
     int.TryParse(str, out a) 
     ints[i++] = a; 
    } 
    return ints; 
} 
관련 문제