문제

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

도움이 되었습니까?

해결책

때를 던지다 예외, 다음 코드가 실행되는 코드는 메소드 (있는 경우) 내에 던지는 캐치 블록입니다. 마침내 블록 (만약에 어떠한). 시도, 트리 캐치, 시도 캐치-피치 또는 시험을 시도 할 수 있습니다. 그런 다음 예외가 처리되지 않으면 캐치 블록으로 재발하거나 전혀 잡히지 않으면 제어가 발신자에게 반환됩니다. 예를 들어이 코드에서 "yes1, yes2, yes3"를 얻을 수 있습니다 ...

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");

다른 팁

던지기는 스택을 위로 움직여서 방법을 종료합니다.

디버거를 사용하여 프로그램을 밟는 것이 좋습니다. 그러면 무슨 일이 일어나고 있는지 스스로 알 수 있습니다. 학습에 매우 유용합니다!

나는 원래 게시물에 대한 답변을 찾기 위해 여기에 와서 다음에 의해 게시 된 매우 귀중한 답변을 거의 놓쳤다. 에릭 립퍼트. 다음은 의견에 게시 된 그의 대답입니다.

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

(1) 던지기 후 방법의 코드가 실행됩니까?
네. 예외가 내부에 있으면 어울리는 캐치 블록 내부의 코드 또는 마지막으로 블록이 실행됩니다. 시도 블록이 없다면 아니오. 가장 가까운 동봉으로 분기를 제어하십시오. 마지막으로, CATCH 또는 (VB) 예외 필터는 스택을 위로 올리십시오.

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

(3) 던지기가 항상 방법을 종료합니까?
아니. 던지기가 시도 중이고 시도에 어울리는 캐치 블록이 있으면 캐치 블록은 예외를 "먹을"수 있습니다. 캐치 블록이없는 경우에만 예외는 호출 스택을 위로 올라가지 않습니다.

이것에 대해 더 많은 질문이 있다면 C# 사양을 읽는 것이 좋습니다. 이 모든 행동은 명확하게 문서화됩니다.

마지막으로, "뼈 헤드"발신자와 같이 "뼈 머리"예외를 던지는 것처럼 들립니다. 발신자의 버그를 방지하기 때문에 좋습니다. 그러나 그렇게한다면 발신자가 당신이 기대하는 것을 아는 방법이 있는지 확인해야합니다! 발신자가 문서를 기반으로 던질 것인지 아닌지를 알 수 없다면, 당신은 골격이없는 예외를 만들지 않았으며, 당신은 예외를 만들었습니다. 보다 http://blogs.msdn.com/ericlippert/archive/2008/09/10/vexing-exceptions.aspx 자세한 내용은.

시도로 코드를 래핑하면 ... 캐치 ... 마침내 블록이 있으면 마침내 코드가 항상 실행됩니다. 예를 들어:

Try
  ' do some stuff here
  ' Examine user input
  If user input isn't valid
      Throw new exception
Catch
   Throw ' Just re-throws the same exception
Finally
   ' This code will execute, no matter what - exception or not
End Try

실제 질문을 따로 따로 : 예외를 사용하여 검증 정보를 사용자에게 다시 제공 할 수 있습니다.

예외를 제기하는 것은 비싼 자원 면적이며 느립니다. 적용 해야하는 여러 가지 유효성 검사 규칙이있는 경우 이들에 대한 특정 코드를 작성하십시오. 예상치 못한 것들에 대한 예외 처리에만 의존해야 할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top