2009-06-13 5 views
20

C#에서 사용자 정의 클래스를 작성 중이며 사람들이 일부 메소드에서 잘못된 입력을 제공하는 경우 몇 가지 예외가 발생합니다. 예외가 발생하면 throw 후에 메소드의 코드가 여전히 실행됩니까? 나는 던지기 후에 휴식을 취해야합니까, 아니면 항상 던지기가 그 방법을 그만 두었습니까?예외를 던진 후에 휴식해야합니까?

+1

세 가지 질문으로 나누십시오. (1) throw 후에 메소드의 코드가 실행됩니까? 예. 예외가 try 내부에 있다면 일치하는 catch 블록 안의 코드가 실행되거나 finally 블록이 실행됩니다. try 블록이 없으면 NO. 가장 가까운 브랜치를 제어하여 finally, catch 또는 (vb에서) 예외 필터가 스택을 막습니다. –

+2

(2) 던진 후에 휴식을 취해야합니까? 아니, 절대로하지 마라. throw 문의 끝점에 도달 할 수 없습니다. throw는 컴파일러에 의해 goto로 취급됩니다. 던지기 직후의 진술에 도달 할 수 없으며 결코 실행되지 않습니다. –

+1

(3) throw는 항상 메소드를 종료합니까? 아니. throw가 try에있어 try에 일치하는 catch 블록이 있으면 catch 블록이 예외를 "먹을"수 있습니다. catch 블록이없는 경우에만 예외가 호출 스택에 대해 로컬이 아닌 goto를 수행합니다. –

답변

30

throw 예외가 발생하면 다음 코드는 메서드 내에서 해당 throw를 처리하는 모든 catch 블록 (있는 경우) finally block (있는 경우)입니다. try, catch-catch, try-catch-finally 또는 try-finally를 가질 수 있습니다. 그런 다음 예외가 처리되지 않거나 catch 블록에 의해 다시 throw되거나 전혀 catch되지 않으면 호출자에게 제어가 리턴됩니다. 예를 들어, 다음 코드에서,

당신이 시도의 코드를 포장 한 경우
try 
{ 
    Console.WriteLine("Yes1"); 
    throw (new Exception()); 
    Console.WriteLine("No1"); 

} 
catch 
{ 
    Console.WriteLine("Yes2"); 
    throw; 
    Console.WriteLine("No2"); 
} 
finally 
{ 
    Console.WriteLine("Yes3"); 
} 

Console.WriteLine("No3"); 
+0

이것은 내 대답에 대한 예외 (작은 e)가 될 것입니다. 나는 일반적인 상황에서 사용되며 GOTO 문과 같이 사용되지 않을 예외의 라인을 따라 생각하고있었습니다. –

+0

@jarrett : 이것은 함수 호출 내에서 throw가 숨겨진다는 점을 제외하고는 일반적인 공통적 인 상황입니다. – configurator

27

스로우가 스택 위로 이동하여 메서드가 종료됩니다.

+2

감사합니다. 그런 기본적인 질문을해서 죄송합니다. – Ross

1

이 ... ... 마지막으로 차단 캐치 ...이 코드에서 "1 아니오, 예 2, 예 3"을 얻을 것이다 마지막으로 항상 실행됩니다. 예 :

1

실제 질문과는 별도로 예외를 사용하여 사용자에게 유효성 검사 정보를 다시 제공 할 수 있습니다.

예외를 발생시키는 것은 리소스가 많고 느립니다. 적용 할 필요가있는 유효성 검사 규칙이 여러 개있는 경우 이들에 대한 특정 코드를 작성하십시오. 예상하지 못한 것에 대해서는 예외 처리에만 의존해야합니다.

+0

나는 이것에 대해서도 궁금해하고 있었다. 높은 점수를 쓰고 있는데, 생성자는 "최대"매개 변수를 취할 수 있습니다. 가능한 최대 점수를 나타냅니다. 잘 클래스가 지원하는 클래스보다 큰 수를 넘기는 경우 생성자가 잘못된 정보로 끝내기를 원하지 않기 때문에 예외가 발생했습니다. 나는 이것에 새로운 사람, 그것을 할 수있는 더 좋은 방법이 있습니까? – Ross

+0

이것은 OP의 답변이 아니라 주석입니다. – Drellgor

3

디버거를 사용하여 프로그램을 실행하는 것이 좋습니다. 그러면 어떤 일이 일어나는지 직접 확인하실 수 있습니다. 학습에 매우 유용합니다!

+0

이것은 좋은 팁입니다. 내가 할게! thanks – Ross

+0

이것은 "팁"이며 원래 질문에 대한 대답이 아닙니다. – Drellgor

+0

와우 내 "대답이 아니야"기는 논박되었습니다. – Almo

2

원래 게시물에 대한 답변을 찾기 위해 여기에 왔는데 Eric Lippert이 게시 한 매우 가치있는 답변을 거의 놓쳤습니다. 코멘트에 게시 된 답변은 다음과 같습니다.

세 가지 질문으로 나눕니다.

(1) throw 후에 메소드의 코드가 실행됩니까?
예. 예외가 try 내부에 있다면 일치하는 catch 블록 안의 코드가 실행되거나 finally 블록이 실행됩니다. try 블록이 없으면 NO. 가장 가까운 브랜치를 제어하여 finally, catch 또는 (vb에서) 예외 필터가 스택을 막습니다.

(2) 던지기 후에 휴식을 취해야합니까?
아니, 절대로 그렇게하지 마십시오. throw 문의 끝점에 도달 할 수 없습니다. throw는 컴파일러에 의해 goto로 취급됩니다. 던지기 직후의 진술에 도달 할 수 없으며 결코 실행되지 않습니다.

(3) 항상 throw하는 방법이 있습니까?
NO. throw가 try에있어 try에 일치하는 catch 블록이 있으면 catch 블록이 예외를 "먹을"수 있습니다. catch 블록이없는 경우에만 예외가 호출 스택에 대해 로컬이 아닌 goto를 수행합니다.

이에 대해 더 궁금한 점이 있으면 C# 사양을 읽는 것이 좋습니다. 이 모든 행동은 분명히 문서화되어있다.

마지막으로, "hey boneheaded caller"처럼 "boneheaded"예외가 발생하는 것처럼 들립니다. 그것은 호출자의 버그를 방지하기 때문에 좋습니다. 하지만 그렇게하면 발신자가 원하는 것을 알 수있는 방법이 있는지 확인해야합니다. 호출자가 문서를 던지거나 읽지 않을 것인지 여부를 파악할 수 없다면 골치 아픈 예외를 만들지 않았으므로 혹독한 예외가 발생했습니다. 자세한 내용은 http://blogs.msdn.com/ericlippert/archive/2008/09/10/vexing-exceptions.aspx을 참조하십시오.

+0

첫 번째 사항 : C#에 이제 예외 필터가 있습니다. 더 이상 VB 용이 아닙니다. –