2009-12-25 3 views
3

일반적으로 예외가 발생하여 잡히면 프로그램 실행이 다시 시작됩니까? 예외가 throw 된 코드 줄을 따라 다시 시작합니까? 아니면 catch 된 곳에서 다시 시작합니까? 또한이 동작은 대부분의 프로그래밍 언어에서 일관됩니까?예외가 발생하면 실행이 다시 시작되는 위치는 어디입니까?

+1

파이썬이나 C++에 대해 물어 보십니까?이 둘은 실제로 멀거나 비슷합니다. –

답변

3

예외가 catch 된 곳, 즉 현재 예외 유형을 특별히 처리하는 catch 블록의 시작 부분에서 실행이 재개됩니다. catch 블록이 실행되고 다른 catch 블록은 무시됩니다 (switch 문의 switch 블록이 복수라고 생각할 수 있습니다). 일부 언어에서는 catch 다음에 finally 블록이 실행될 수도 있습니다. 프로그램은 전체 try ... catch ... finally ... 다음에 오는 명령으로 진행합니다.

예외가 블록에서 발견되지 않으면 예외는 현재 함수의 호출자에게 전파되고 catch이 예외를 처리 할 때까지 호출 스택을 전파합니다. 이 경우 함수 호출을 매크로처럼 생각할 수 있습니다. 호출되는 각 함수의 코드를 삽입하면 모든 try .. catch ... finally ... 블록의 중첩이 명확하게 표시됩니다.

예외 처리기가없는 경우 일반적으로 프로그램이 충돌합니다. (일부 언어는이 시점에서 다를 수 있음).

실행 흐름에 대한 동작은 내가 아는 모든 언어에서 일관됩니다. 유일한 차이점은 try ... catch ... finally ... 구조에 있습니다. finally은 모든 언어에 존재하지 않으며 일부 언어는 동일한 블록에 finallycatch을 허용하지 않습니다 (2를 사용하려면 두 개를 중첩해야합니다). 일부 언어는 허용합니다 모든 언어 (C++에서는 catch (...))는 일부 언어에서는 그렇지 않습니다.

+2

문제는 프로그램 실행이 예외가 던져지고 잡혔습니다. * 당연히 catch 블록이 실행되었습니다. @theactactor가 찾고 있던 대답은 다음과 같습니다. * catch 블록에서 예외가 다시 throw되거나 catch 블록 내에서 새 예외가 throw되지 않는 한 catch 블록 다음 줄에서 실행이 계속됩니다. * – riderBill

1

예외가 발견 된 경우 다시 시작됩니다. 그렇지 않으면 예외 조항을 작성하는 시점은 무엇입니까?

+0

Perl6 사람들이 생각하고있는 더 복잡한 기능 중 하나는 재개 가능한 예외입니다. 내가 올바르게 이해한다면, 예외 핸들러는 예외가 던져진 곳에서 실행을 재개 할 수있는 옵션을 가질 것이다. 그것이 좋은 것인지 확실하지 않습니다 (사람들이 이해할 수있는 코드로 이어짐). – Thilo

+0

나는 던지는 코드가 적어도'throw [[returnable]] Type();'처럼 신호 할 필요가 있다고 생각한다. 그렇지 않으면 나는 그것이 큰 혼란을 초래할 수 있다고 상상한다. –

+0

모두가 큰 혼란을 두려워하지 않습니다 ;-) – Thilo

7

catch 블록 내부의 코드가 실행되고 원래 실행이 catch 블록 바로 다음으로 계속됩니다.

+1

참조를 잊어 버렸습니다. http://docs.python.org/tutorial/errors.html 및 http://docs.python.org/c-api/exceptions.html –

2

catch 블록 (예외가 발견 된 곳)에서 실행이 계속됩니다.
예외를 사용하는 언어에서 일관됩니다.

주목할만한 점 (특히 C++의 경우)
throw 및 catch 지점 사이에서 순서대로 스택에서 생성 된 모든 개체가 올바르게 소멸되도록 예상 된 순서대로 스택이 해제됩니다. 이로 인해 기술은 RAII로 알려져 있습니다.

2

나는 Bjarne Stroustrup의 "Design & Evolution"사본을 가지고 있지 않지만 재개 가능한 예외에 대한 경험을 거기에 적었다고 생각합니다. 그들은 올바른 일을하기가 상당히 어려워 졌음을 발견했습니다. 결국, 일부 라인에서 예기치 않은 오류가 발생하면 예외 핸들러가 문맥을 알지 못하고 실행을 재개 할 수 있도록 문제를 충분히 패치해야합니다. 이것은 메모리 부족 오류 일 수 있습니다 (이러한 오류는 종종 가출 된 메모리 할당의 결과이며 더 많은 메모리를 추가하면 실제로는 수정되지 않습니다). 일반적으로 예외는 아닙니다.

그래서 C++ 및 내가 익숙한 모든 언어에서 실행은 catch와 함께 다시 시작되며 예외를 던진 곳으로 자동 복귀하지 않습니다.

+4

사본이 있습니다. 그는 D & E를 손에 쥐어주었습니다. (아마도 내 모든 시간을 가장 좋아하는 CS 책일 것입니다.) Sun/Xerox PARC 전문가는 "종료가 재개보다 선호되며 이는 의견의 문제가 아니라 수년 간의 경험의 문제입니다"라고 말했습니다. 매혹적이지만 유효하지 않습니다. " –

관련 문제