2012-02-28 5 views
0

값에 대해 여러 가지 bool 검사가 있습니다. 나는 어떤 값을 false로 반환했는지 확인하고 싶습니다.Try Catch를 사용하여 부울 값을 찾습니다.

bool formIsValid = true; 

try{ 

    Utility.testStringHasValue(txEmail.Text); <--- true 
    Utility.testStringHasValue(txFirstName.Text); <--- true 
    Utility.testStringHasValue(txLastName.Text); <--- FALSE 
    Utility.testStringHasValue(txUserEmployer.Text); <--- true 
    Utility.testStringHasValue(txUserPassword.Text); <--- true 
    Utility.testStringHasValue(txUserPassword2.Text); <--- true 
} 
catch (Exception) 
{ 
    formIsValid = false 
} 

..이 하나처럼 전혀 다른 솔루션 :

내가 추적을 시도!

UPDATE

I는 시도가/완전히 잡아 및 사용 제거 :

bool isFormValid = Utility.testStringHasValue(txEmail.Text) 
       && Utility.testStringHasValue(txFirstName.Text) 
       && Utility.testStringHasValue(txLastName.Text) 
       && Utility.testStringHasValue(txUserEmployer.Text) 
       && Utility.testStringHasValue(txUserPassword.Text) 
       && Utility.testStringHasValue(txUserPassword2.Text) 
       && (txUserPassword.Text == txUserPassword2.Text); 
+6

예외 처리를위한 중대한 케이스. – Robaticus

+0

'Utility.testStringHasValue' 란 무엇입니까? –

+0

여기 try/catch는 기본적으로 레이블이없는 goto로 작동합니다. – asawyer

답변

2

당신이 유틸리티 방법을 썼다면, 그때는 그것이 문자열 값이 있는지 여부를 나타내는 부울을 반환 특히, 예외가 발생하지 않습니다 확인하는 것이 좋습니다 것입니다.

다음을 수행하고 try { } catch { }을 완전히 피할 수 있습니다. 왼쪽이 true을 반환하지 않는

bool formIsValid = Utility.testStringHasValue(txEmail.Text); <--- true 
        && Utility.testStringHasValue(txFirstName.Text); <--- true 
        && Utility.testStringHasValue(txLastName.Text); <--- FALSE 
        && Utility.testStringHasValue(txUserEmployer.Text); <--- true 
        && Utility.testStringHasValue(txUserPassword.Text); <--- true 
        && Utility.testStringHasValue(txUserPassword2.Text); <--- true 

&&

그렇게 Utility.testStringHasValue은 실제로 당신의 예에서 3 번 호출됩니다, 오른쪽을 평가 호출하지 않습니다.

0
if (Utility.testStringHasValue(txEmail.Text) && 
    Utility.testStringHasValue(txFirstName.Text) && 
    Utility.testStringHasValue(txLastName.Text) && 
    Utility.testStringHasValue(txUserEmployer.Text) && 
    Utility.testStringHasValue(txUserPassword.Text) && 
    Utility.testStringHasValue(txUserPassword2.Text) 
) { 
    all_good = true; 
} else { 
    no_so_good = true; 
} 

예외 처리는 제어 로직으로 사용할 수 없습니다. 그것은 목적을 모호하게 만듭니다.

0

false을 반환해도 예외가 발생하지 않기 때문입니다. 당신은 항상 할 수있는 : 예외가 성능 저하가 발생하는 경우

if (!(
    Utility.testStringHasValue(txEmail.Text) && 
    Utility.testStringHasValue(txFirstName.Text) && 
    Utility.testStringHasValue(txLastName.Text) && 
    Utility.testStringHasValue(txUserEmployer.Text) && 
    Utility.testStringHasValue(txUserPassword.Text) && 
    Utility.testStringHasValue(txUserPassword2.Text))) 
{ 
    throw new Exception("Something is false"); 
} 
0
if (!(condtion1 && condition2 && .... && conditionN)) 
{ 
    // first condition evaluating to false gets you here 
    // anything afterwards is not checked. 
} 
4

망가, 그 시나리오에 대한 예외를 사용합니다. 문자열 모든 필드가 유효한지 확인하기 위해 & & (과) 연산자를 사용할 수

(String.IsNullOrEmpty)을 입력하면

도 확인 이미 사용할 수있는 방법이있다.

예 : 또는

bool isValid = !String.IsNullOrEmpty(txtEmail.Text) && !String.IsNullOrEmpty(txtFirstname.Text) && !String.IsNullOrEmpty(txtLastName.Text); 

, 당신은 그것에게 를 사용하여 다른 방법으로 플립 수 || (또는) 연산자

bool isInvalid = String.IsNullOrEmpty(txtEmail.Text) || String.IsNullOrEmpty(txtFirstname.Text) || String.IsNullOrEmpty(txtLastName.Text); 
0

Utility.testStringHasValue()을 false로 반환하고 예외를 throw하지 마십시오. 다음

formIsValid= Utility.testStringHasValue(txEmail.Text) && 
    Utility.testStringHasValue(txFirstName.Text) && 
    Utility.testStringHasValue(txLastName.Text) && 
    Utility.testStringHasValue(txUserEmployer.Text) && 
    Utility.testStringHasValue(txUserPassword.Text) && 
    Utility.testStringHasValue(txUserPassword2.Text) ; 

if (formIsValid) { 
    //whatever 
} else { 
    //whatever 
} 
0

testStringHasValue는 무엇을 반환합니까? boolean이 다음과 같이 대신 모든 결합 된 반환 값을 사용한다면 :

boolean result = true; 
result = result && Utility.testStringHasValue(txEmail.Text); 
result = result && Utility.testStringHasValue(txFirstName.Text); 
return result; 

예외를 사용하는 방식은 그리 좋지 않습니다.이러한 유형의 유효성 검사에 사용해서는 안되며 catch에 도달하려는 의도는 부울 false 값을 반환하기 때문에 실제로 onyl이 아닌 예외를 throw하는 경우에만 유효합니다.

0

try..catch 예외 처리는 리소스 단위로 간단한 부울 검사보다 비용이 많이 듭니다. msdn 사이트에서 다시 : try..catch : "런타임에 예외를 잡으면 추가 오버 헤드가 발생하고 예외를 피하기 위해 사전 검사보다 느릴 수 있습니다." 이전과 같이 if..then을 사용하십시오.

0

전달 된 모든 값이 비어 있지 않은지 확인하기 위해 다시 사용할 수있는 방법을 작성해 보셨습니까? 여러 장소에서 코드를 사용하는 경우이 같은 뭔가 중요한 시간을 절약 할 수 있습니다 :

using System.Linq; 

public static class Utility 
{ 
    public static bool EnsureValuesNotEmpty(params string[] values) 
    { 
     return values.All(value => !string.IsNullOrWhiteSpace(value)); 
    } 
} 

이 그럼 당신은 훨씬 덜 코드로 기능을 다시 사용할 수 있습니다, 당신이 확인하고자하는 모든 값을 전달 그것 :

var formIsValid = Utility.EnsureValuesNotEmpty(txEmail.Text, 
               txFirstName.Text, 
               txLastName.Text, 
               txUserEmployer.Text, 
               txUserPassword.Text, 
               txUserPassword2.Text); 
관련 문제