2009-10-05 2 views
9

일부 로깅을 수행 할 메소드를 꾸밀 수있는 방법이 있습니까? 그렇다면 무조건적으로 예외를 throw 할 수 있습니까? 나는이 같은 코드가메소드를 표시하는 방법은 무조건 throw됩니까?

:

void foo(out int x) 
{ 
    if(condition()) { x = bar(); return; } 

    // compiler complains about x not being set yet 

    MyMethodThatAlwaysThrowsAnException("missed something."); 
} 

어떤 제안 :이처럼를 작성하려고하면

void foo(out int x) 
{ 
    if(condition()) { x = bar(); return; } 

    // notice that x is not yet set here, but compiler doesn't complain 

    throw new Exception("missed something."); 
} 

을 나는 문제를 얻을? 감사.

+0

어떤 문제가 있습니까? –

+0

"x는 특성을 가지고 있으며 아직 메서드의 끝에 설정되지 않았습니다" – k0dek0mmand0

+1

혼란 스럽습니다 - x가 설정되고 반환 될 때 throw되지 않으면 무조건 throw되는 방식 – Matt

답변

17

어때요?

bool condition() { return false; } 
int bar() { return 999; } 
void foo(out int x) 
{ 
    if (condition()) { x = bar(); return; } 
    // compiler complains about x not being set yet 
    throw MyMethodThatAlwaysThrowsAnException("missed something."); 
} 
Exception MyMethodThatAlwaysThrowsAnException(string message) 
{ 
    //this could also be a throw if you really want 
    // but if you throw here the stack trace will point here 
    return new Exception(message); 
} 
2

예외가 항상 발생한다는 것을 알고 있다면 왜 중요합니까? 그냥 그래서 컴파일 할 수 뭔가에 변수를 설정 :

void foo(out int x) 
{ 
    if(condition()) { x = bar(); return; } 

    x = 0; 

    MyMethodThatAlwaysThrowsAnException("missed something."); 
} 
+3

그건 내가 피하고 싶었던 바로 그 것입니다.:) – k0dek0mmand0

0

그것은 귀하의 질문에 대답하지 않고 매개 변수를 사용하는 경우이 방법의 시작 부분에서 그들을 초기화하는 것이 좋습니다 항상. 이 방법은 어떤 컴파일러 오류가 없습니다 :

void foo(out int x) 
{ 
    x = 0; 
    if(condition()) { x = bar(); return; } 
    MyMethodThatAlwaysThrowsAnException("missed something."); 
} 
+4

필자는 매개 변수를 할당해야한다고 생각합니다. 또는 일부 코드 경로에서 매개 변수를 지정하는 것을 잊었 기 때문에 컴파일 타임에 일부 숨겨진 버그를 막을 수 있습니다. –

1

x이 매개 변수 밖으로 하고 설정해야합니다 당신이 이런 식으로 방법을 표시 할 방법이 없습니다 앞으로

+3

예외가 throw되지 않는 한 – k0dek0mmand0

+1

out 매개 변수가 메서드에서 초기에 설정되고 그렇지 않은 경우 기본값을 할당하는 것이 좋습니다. –

2

이동하기 전에.

가능성이 있지만, 예에서 out 매개 변수를 사용하는 패턴이 조금 이상합니다. 대신에 메서드에 반환 형식이 있어야하는 이유는 무엇입니까?

int Foo() 
{ 
    if (condition()) return bar(); 

    MyMethodThatAlwaysThrowsAnException("missed something."); 
} 
+0

그저 간단한 예일뿐입니다. 실제 코드는 다소 복잡합니다. – k0dek0mmand0

+0

@ k0dek0mmand0 : 그럴 수도 있다고 생각합니다. 나는 당신이 운이 좋지 않다는 것을 알았습니다. 컴파일러에게'MyMethodThatAlwaysThrowsAnException'이 항상 던졌습니다. – LukeH

1

x를 설정하지 않으려면 대신 ref 매개 변수를 사용하십시오.

void foo(ref int x) 
{ 
    if(condition()) { x = bar(); return; } 

    // nobody complains about anything 

    MyMethodThatAlwaysThrowsAnException("missed something."); 
} 
2

그것은 아주 오래된 스레드의하지만 난 당신이 처음부터이 다른 작성해야 추가 할 :

void foo(out int x) 
{ 
    if (!condition()) 
     MyMethodThatAlwaysThrowsAnException("missed something."); 

    x = bar(); 
    // and so on... 
} 

그런 식으로 컴파일러는 불평하지 않을 것이다 당신의 코드는 훨씬 더 분명하다.

+0

실제 코드는 아마도 더 복잡 할 것이므로 제안이 의미가 없을 수도 있습니다. –

관련 문제