문제

구문,따로의 차이점은 무엇입

try {
}
catch() {
}
finally {
    x = 3;
}

try {
}
catch() {
}

x = 3;

편집:습니다.NET2.0?


그래서

try {
    throw something maybe
    x = 3
}
catch (...) {
    x = 3
}

은 behaviourally 에 해당?

도움이 되었습니까?

해결책

에 따라 달라 언어로도 있을 수 있습니다 약간의 의미 차이가 있지만,아는 것이 실행하는(거의)항상 경우에도,코드에도록 예외가 발생했습니다.

에서 두 번째 예제 코드에서는 반환 또는 종료,x=3 이 실행되지 않습니다.처음에 그것을 것입니다.

니다.인터넷 플랫폼에서 어떤 경우의 실행 마지막으로 차단이 발생하지 않:Security Exceptions,스레드 정학,컴퓨터를 종료:),등등.

다른 팁

하게 하는 것은,반송할 경우 내부 try 블록 마지막으로 아직도 실행하지만 코드는 아래에 나열된 try-캐치-마지막으로 차단하지 않습니다.

에서 Java:

마지막으로 항상 가져오라고에 관계없이,의 경우에는 예외로 올바르게 잡은 catch(),또는 사실이 있는 경우에 잡니다.

catch 도 마지막으로 은 매우 중요합니다.확신할 수 있는 경우에도 예외가 발생하였을때,코드에서 마지막으로 차단 실행됩니다.그것은 매우 중요한 처리에서 외부 자원을 해제.가비지 컬렉션을 하지 않을 것입니다.에서 마지막으로 부분을 필요가 없 return 문 또는 예외가 있습니다.그렇게 할 수 있지만,그것은 나쁜 연습으로 이어질 수 있습을 예상치 못한 결과가 발생합니다.

당신이 시도하는 경우 이 예제:

try {
  return 0;
} finally {
  return 2;
}

결과 2:)

비교를 다른 언어: 서 마지막으로

거기에 여러 가지 것들이 마지막으로 차단 유용합니다:

  1. 는 경우에 반환에서 시도하거나 블록,마지막으로 블록가 아직도 실행되기 전에 바로 제어가 주어진 다시 호출 기능
  2. 예외가 발생하면 내 catch 블록 또는 포착되지 않는 형식의 예외에서 발생하도록 코드에서 마지막으로 블록가 아직도 실행됩니다.

이들에게 마지막으로 블록 우수한 파일을 닫을 처리 또는 소켓을 지원합니다.

는 경우에는 시도하고 캐치는 빈 차이가 없습니다.그렇지 않으면 당신은 확신 할 수 있습니다,그 마지막으로 실행됩니다.

는 경우,예를 들어 던져 새로 예외에서 당신의 catchblock(를 다시 발생시키고),이 할당됩니다야만 실행된 경우에 마지막으로 차단합니다.

일반적으로 마지막으로 사용하여 깨끗한 후에 스스로(가까운 DB 연결을,파일 핸들을 좋아하는).

당신은 결코 사용하여 제어-문(반환,휴식,계속)에서 마지막으로,이 유지 관리하는 데 큰 어려움이 있습므로 간주 나쁜 사례

마지막으로 블록 항상 호출됩니다(정말 잘하지 ...)는 경우에도 예외가 발생 또는 반환 문에 도달(지만 될 수 있는 언어에 따라 다름).그것의 방법을 정리하다는 것을 알고 항상 호출됩니다.

@이안 및@매트:

고 싶지 않은"눈물을 아래로"아무것도에서 마지막으로{}는"설정"내 try{}으로 규칙이 있습니다.더 나은 것을 뽑아 스트림의 창조의 외부 try{}.처리해야 하는 경우에는 예외에 스트림을 만들이 할 수 있에서 더 큰 범위가 있습니다.

StreamReader stream = new StreamReader("foo.bar");  
try {
    mySendSomethingToStream(stream);
}
catch(noSomethingToSendException e) {
    //Swallow this    
    logger.error(e.getMessage());
}
catch(anotherTypeOfException e) {
    //More serious, throw this one back
    throw(e);
}
finally {
    stream.close();  
}

정리할 수 있습니다 그래서 어떤 열려있는 연결을,etc.에서 초기화된다.는 경우에 당신을 연결하고 그 예외가 발생하는 예외가 되지 않을 것이 제대로 닫힙니다.이러한 유형의 시나리오가 무엇을 마지막으로 차단합니다.

마지막으로 차단되어를 실행하는지 여부를 잡은 예외 또는하지 않습니다.보 Try/Catch/마지막으로 예

@Ed, 에,당신은 생각할 수도 있습니다 같은 것 catch(...) 를 잡는 비 지정된 예외에서는 C++.

finally 는 코드는 실행되지 않에서 무슨 일 catch 블록이 있습니다.

Microsoft 는 데 도움이 페이지 try-마지막으로 C#

마지막으로 블록가와 같은 범위에 try/를 잡을,그래서 당신은에 액세스를 모든 변수를 정의한다.

상상 당신은 파일 핸들러,이에 차이는 것이 얼마나 작성합니다.

try
{
   StreamReader stream = new StreamReader("foo.bar");
   stream.write("foo");
}
catch(Exception e) { } // ignore for now
finally
{
   stream.close();
}

StreamReader stream = null;
try
{
    stream = new StreamReader("foo.bar");
    stream.write("foo");
} catch(Exception e) {} // ignore

if (stream != null)
    stream.close();

하지만 기억하는 것도 내 마지막으로 사용할 수 있다는 보장은 없다.상상을 얻을 것을 중단 신호,windows 충돌하거나 전원이 사라졌다.에 의존하고 마지막으로 비즈니스를 위한 중요한 코드가 나쁜 것입니다.

어떤 코드에서 마지막으로 실행에서도에서의 이벤트 처리되지 않은 예외는 아니다.일반적으로 마지막으로 코드를 사용하고 깨끗한 지역 선언의 관리되지 않는 코드를 사용합니다.폐기().

마지막으로 블록 허용,개발자,정리를 한 후에,자신에 관계 없이 작업을 의 선행하는 코드에서 try{}블록 오류가 발생한,그리고 다른 사람들이 지적 이고,주로 떨어진 우산 아래의하는 리소스를 해제하 닫는 포인터/소켓/결과 집합,연결을 반환됩니다.

@매트는 매우 정확한 그가 항상 잠재적인 위해"열심히"오류-마지막으로 블록을 포함하면 안된 업무에 중요한 코드하는 항상 해야 할 트랜잭션 내부에 try{}

@매트로 다시 진정한 아름다움은 그것은 당신이 던지 예외가 다시 당신의 자신의 방법,그리고 여전히 보증하는 당신은 정돈:

try
{
StreamReader stream = new StreamReader("foo.bar");
mySendSomethingToStream(stream);
}
catch(noSomethingToSendException e) {
    //Swallow this    
    logger.error(e.getMessage());
}
catch(anotherTypeOfException e) {
    //More serious, throw this one back
    throw(e);
}
finally
{
stream.close();
}

그래서,우리는 잡을 수있는 많은 종류의 제외,프로세스들을 다르게(첫 번째 실행을 할 수 있습한 아무것도 넘어 try{},두 번째 효과적으로 반환)하지만 항상 깔끔하게하고 반듯하게 합니다.

에서 Java 를 사용하여 그것에 대한 아무것도는 당신이 원하는 실행하는 여부에 관계없이 사용한"return",실행을 통해서도 블록 또는 예외를 잡았다.

예를 들어,닫는 데이터베이스 세션이나 JMS 연결,또는 일부를 할당 해제 OS 리소스입니다.

이것은 비슷합니다.NET?

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