2013-03-28 3 views
1

다음 예제에서는 데이터베이스에서 값을 반환하고이 값을 double로 변환합니다. NULL로 인해 넘어지면 0이 기본값으로 설정됩니다.Try 캐치를 사용하여 값을 변환하십시오.

using (SqlCommand cmd = new SqlCommand(sql.ToString(), conn)) 
{ 
    try 
    { 
     this.value = Convert.ToDouble(cmd.ExecuteScalar()); 
    } 
    catch (Exception) 
    { 
     this.value = 0; 
    } 
} 

이 경우 Try Catch를 사용하면 악의적 인 것으로 간주됩니까? 이 시나리오를 처리하는 더 좋은 방법은 무엇입니까?

+0

대신에'double.TryParse'를 사용할 수 있습니다. 반드시 좋은 것은 아니지만 예외 처리보다 빠릅니다. – Nolonar

+3

@Nolonar 물론 더 나은 방법입니다. ** 흐름을 제어하기 위해 ** 예외를 사용하지 마십시오. – DHN

+0

@DHN 찍은 포인트. 그것을 지적 해 주셔서 감사합니다 :) – Nolonar

답변

13

이 경우 Try Catch를 사용하면 악의적이라고 간주 될 수 있습니까?

물론입니다. 그 외의 것 이외에, 이라면 무엇이든이 실패하면 반환 값은 0뿐 아니라 반환 값이 null 일 때도 실패합니다. (당신은 정말는 전체 테이블이 삭제 된 있다고 밝혀지면 마치 다의 벌금을 계속 하시겠습니까?)

당신이 널 반환 값을 검색하도록하려면, 당신은 이렇게 명시 적으로 수행해야합니다

object result = cmd.ExecuteScalar(); 
return result == null ? 0d : (double) result; 

여전히이 아닌 null 반환 값이있는 경우 adouble이 아닌 경우 throw합니다 (의도적으로). 쿼리 유형이 무엇인지 알아야하며, 잘못된 유형이있는 경우 실패합니다.

5

당신은 Double.TryParse을 원한다. 이것은 부울을 반환하고, 값을 할당받는 out 매개 변수를 사용하여 초기화되지 않은 이중 변수를 전달한다.

+1

나는 대런의 답에 대한 설명을 이미 요약 한 이유로 강력하게 동의하지 않습니다. 'TryParse'는 변환 할 * 문자열 *이있을 때 적합합니다. 'ExecuteScalar'는 값이 자연스럽게'double' 인 경우 문자열을 반환하지 않아야하며 문자열 변환을 도입 할 이유가 없습니다. –

+0

@JonSkeet 죄송합니다. 전에 당신에게 대답했지만, 물론 당신은 정확하고 새로운 것을 배웠습니다, 고마워요! – JMK

0

나쁜 실행으로 간주됩니다. Catch는 이와 같은 프로그램 흐름을 의미하지 않습니다. 다른 예외가 throw 된 경우 계속 catch하고 값을 0으로 설정하십시오.

프로그램 흐름을 구체적으로 확인하십시오. 명시 적으로 null을 처리하는 것이 더 효율적이며 따라하기 쉽습니다.

관련 문제