2011-05-09 6 views
1

는이 코드를 가지고 내가 마지막으로 실행try/catch/finally, 내 catch에서 돌아 왔을 때 마침내 방지하는 방법은 무엇입니까?

 try 
     { 
      throw new Exception("Try Error!!!"); 
     } 
     catch(Exception exp) 
     { 
      Console.WriteLine(exp.Message); 
      Console.ReadLine(); 
      if(exp.Message == "Try Error!!!") 
       return; 
     } 
     finally 
     { 
      Console.WriteLine("Finally..."); 
      Console.ReadLine(); 
     } 

그러나 작동하지 않습니다 반환을 방지합니다.

+6

당신의 코드는 몇 가지 문제점을 보여줍니다. 첫째, 예외를 사용하여 실행 흐름을 제어하는 ​​것처럼 보이므로 권장되지 않습니다. 'catch' 블록으로 건너 뛰기위한 예외를 던지면'goto'를 사용하는 것과 다르지 않습니다.다음으로, 당신은'System.Exception'을 던지고,'System.Exception'을 잡아 내고, 그 메시지를 검사하여 그 타입을 결정합니다. C#과 같은 OOP 언어를 사용하는 경우 적어도 여러 개의 사용자 정의 Exception 클래스를 만들고 여러 'catch'블록을 사용하여 구별 할 수 있습니다. 모든 예외를 잡는 것은 잘못입니다. – Groo

+0

@ LightWing 그것은 당신이 그것을 원하고 또한 agaisnt oops다는 것을주의 깊게 질문에서 지정하십시오. 당신이 아직도 그것을하고 싶다면 왜 마침내해야합니까? – amod

답변

10

최종적으로 세 개의 조건을 다음에서 실행되지 않습니다

  1. 을 System.exit()가 try 또는 catch 블록에서 호출됩니다.
  2. try 블록 안에 무한 루프가 있습니다.
  3. try 블록을 실행하는 동안 시스템이 중단되거나 전원이 끊깁니다. 다른 모든 조건

.... 최종적으로 항상 마지막으로 코드의 실행을 제어하는 ​​부울 변수를 가진 것은 그것을 위해 이동 ... 영리한 방법입니다 ... 실행 ...

+1

정말 대단한 대답입니다. – Saleh

+1

또한 finally 블록은 런타임이 종료되면 (예 : 런타임에서 스택 오버플로 예외가 발생하거나 종료 자 스레드에서 처리되지 않은 예외가 발생할 경우) 실행되지 않을 수 있습니다. –

+0

@Brian Rasmussen에 동의합니다 .... – aProgrammer

2

유일한 방법은 당신이 할 필요가 없습니다 귀하의 finally 코드 예컨대 시험 :

bool handled = false; 
try 
{ 
    throw new Exception("Try Error!!!"); 
} 
catch(Exception exp) 
{ 
    Console.WriteLine(exp.Message); 
    Console.ReadLine(); 
    if (exp.Message == "Try Error!!!") 
    { 
     handled = true; 
     return; // This isn't really necessary unless you have code below it you're not showing 
    } 
} 
finally 
{ 
    if (!handled) 
    { 
     Console.WriteLine("Finally..."); 
     Console.ReadLine(); 
    } 
} 

...하지만 난 정말 당신의 논리를 재 방문라고 생각 하는데요 플래그 변수를 설정하는 것입니다. 요점 finally 당신이 try 블록의 코드에서 조기 복귀 여부를 try 블록 내에서 발생하는 상관없이, 그 finally 코드를 실행하는 것입니다, 또는 예외가 발생하거나 catch 블록 내에서 반환합니다.

8

마침내 요점은 - 항상 실행됩니다.

이 시도 :

bool runfinally = true; 
try { 
    throw new Exception("test"); 
} catch { 
    runfinally = false; 
} finally { 
    if(runfinally) { 
    // do stuff. 
    } 
} 
+0

ps - 위의 Groo의 코멘트가 중요합니다. 당신이하고 싶은 생각을하는 방법을 설명했습니다. 사실, 기회는 당신이 그것을하고 싶지 않다는 것입니다;) – Nathan

2

마지막의 전체 포인트는 관계없이 try/catch 블록이 실행 방법을 실행하는 것입니다. 한 가지 해결 방법은 다음과 같을 수 있습니다.

bool runfinallycode = true; 
    try 
    { 
     throw new Exception("Try Error!!!"); 
    } 
    catch(Exception exp) 
    { 
     Console.WriteLine(exp.Message); 
     Console.ReadLine(); 
     if(exp.Message == "Try Error!!!") 
      runfinallycode = false; 
    } 
    finally 
    { 
     if(runfinallycode) 
     { 
      Console.WriteLine("Finally..."); 
      Console.ReadLine(); 
     } 
    } 
-1

그러나 반환은 if 절에 있으므로 항상 작동하지는 않습니다. 캐치 안에 if를 넣으십시오.

+0

나는 그것을했지만 정말 작동하지 않습니다. – Saleh

3

왜 그렇게하고 싶습니까?

마지막으로 allways를 실행하고 어쨌든 완료해야하는 일부 작업을 수행합니다. try가 실행될 때만 코드가 실행되도록하고 try 문에서 작성해야합니다. 그렇지 않은 경우에만 실패합니다 다음 캐치 하나. 두 경우 모두 조정해야하는 코드는 finally 섹션에 작성해야합니다.

1

마지막으로 try catch 블록에서 무슨 일이 일어나더라도 실행됩니다. 그렇게하면 기능을 종료하기 전에 자원을 확보 할 수 있습니다.

1

finally 블록 Finally Block의 실행을 피하기 위해 System.exit()을 사용할 수 있습니다. 하지만 실행이 방해되어서는 안된다고 판단되면 다시 질문하십시오.

관련 문제