일반적으로 그렇습니다. 마지막으로 실행됩니다.
다음 세 가지 시나리오의 경우 최종적으로 항상 실행됩니다.
- 예외는 발생하지 않습니다
- 동기 예외 (정상 프로그램 흐름에서 발생하는 예외).
여기에는 System.Exception에서 파생 된 CLS 호환 예외와 System.Exception에서 파생되지 않은 CLS 비준수 예외가 포함됩니다. CLS 비준수 예외는 RuntimeWrappedException에 의해 자동으로 줄 바꿈됩니다. C #은 CLS 이외의 불만 예외를 처리 할 수 없지만 C ++와 같은 언어는 예외를 처리 할 수 있습니다. C #은 비 CLS 규격 예외를 발생시킬 수있는 언어로 작성된 코드를 호출 할 수 있습니다.
- 비동기 ThreadAbortException
.NET 2.0부터 ThreadAbortException은 더 이상 최종 실행을 방해하지 않습니다. ThreadAbortException은 이제 마지막 이전 또는 이후에 게양됩니다. 스레드 중단이 발생하기 전에 try가 실제로 입력 된 경우 마지막은 항상 실행되며 스레드 중단에 의해 중단되지 않습니다.
다음 시나리오에서는 최종적으로 실행되지 않습니다.
비동기 StackOverflowException.
.NET 2.0부터 스택 오버플로로 인해 프로세스가 종료됩니다. 마지막으로 CER (Constrained Execution Region)을 만들기 위해 추가 제한 조건이 적용되지 않는 한 마지막은 실행되지 않습니다. CER은 일반 사용자 코드에서 사용해서는 안됩니다. 모든 프로세스가 스택 오버플로에서 종료 된 후 정리 코드가 항상 실행되어야하는 중요한 위치에서만 사용해야하며, 따라서 모든 관리 대상 객체는 기본적으로 정리됩니다. 따라서 CER과 관련이있는 유일한 위치는 프로세스 외부에 할당 된 리소스 (예 : 관리되지 않는 핸들)입니다.
일반적으로 비 관리 코드는 사용자 코드가 사용하기 전에 일부 관리 클래스에 의해 랩핑됩니다. 관리 랩퍼 클래스는 일반적으로 SafeHandle을 사용하여 관리되지 않는 핸들을 랩합니다. SafeHandle은 중요한 종료 자와 CER에서 실행되는 정리 메소드를 구현하여 정리 코드의 실행을 보장합니다. 이러한 이유로 CER이 사용자 코드를 통해 흩어지지 않아야합니다.
따라서 최종적으로 StackOverflowException에서 실행되지 않는다는 사실은 프로세스가 종료되기 때문에 사용자 코드에 영향을 미치지 않습니다. SafeHandle 또는 CriticalFinalizerObject 외부에서 관리되지 않는 리소스를 정리해야하는 경우가있는 경우 다음과 같이 CER을 사용하십시오. 관리되지 않는 개념은 설계 상 관리되는 클래스 및 적절한 SafeHandle로 추상화되어야합니다.
예를 들어
// No code can appear after this line, before the try
RuntimeHelpers.PrepareConstrainedRegions();
try
{
// This is *NOT* a CER
}
finally
{
// This is a CER; guaranteed to run, if the try was entered,
// even if a StackOverflowException occurs.
}