시도 블록의 값을 반환하면 Finally 문의 코드가 실행됩니까?
저는 친구를 위해 코드를 검토하고 있으며, 그가 최종적으로 시도한 블록 안에서 반환문을 사용하고 있었다고 말합니다.Finally 섹션의 코드는 나머지 시도 블록이 실행되지 않는데도 계속 실행됩니까?
예:
public bool someMethod()
{
try
{
return true;
throw new Exception("test"); // doesn't seem to get executed
}
finally
{
//code in question
}
}
간단한 대답: 예.
보은네,▁the. 마지막 하여 어떤 할 수 보장됩니다.마지막 섹션은 예외 또는 반환 문을 포함하여 발생하는 모든 작업을 실행하도록 보장됩니다.입니다.OutOfMemoryException
,StackOverflowException
).
이러한 상황에서 비동기 예외 및 신뢰할 수 있는 코드에 대해 자세히 알아보려면 제한된 실행 영역에 대해 읽어 보십시오.
여기 작은 테스트가 있습니다.
class Class1
{
[STAThread]
static void Main(string[] args)
{
Console.WriteLine("before");
Console.WriteLine(test());
Console.WriteLine("after");
}
static string test()
{
try
{
return "return";
}
finally
{
Console.WriteLine("finally");
}
}
}
결과는 다음과 같습니다.
before
finally
return
after
MSDN의 견적
마지막으로 앞의 시도 블록이 종료되는 방법에 관계없이 코드의 문 블록이 실행되도록 보장하는 데 사용됩니다.
일반적으로 그렇습니다. 최종적으로 실행됩니다.
다음 세 가지 시나리오의 경우 마지막으로 항상 가 실행됩니다.
- 예외가 발생하지 않습니다.
- 동기식 예외(정상적인 프로그램 흐름에서 발생하는 예외)
여기에는 시스템에서 파생된 CLS 호환 예외가 포함됩니다.시스템에서 파생되지 않은 예외 및 비 CLS 호환 예외입니다.CLS 에 의해 자동으로 . RuntimeWraped는 RuntimeWraped입니다.예외. 은 비 CLS 발생시킬 수 C++과 같은할 수 있습니다C#은 비 CLS 불만 예외를 발생시킬 수 없지만 C++과 같은 언어는 발생할 수 있습니다.C#은 CLS 호환되지 않는 예외를 발생시킬 수 있는 언어로 작성된 코드를 호출할 수 있습니다. - 은 다음과 같습니다.
2더 최종.NET 2.0부터는 ThreadAbortException이 더 이상 최종 실행을 방해하지 않습니다.이제 ThreadAbortException이 최종 이전 또는 이후에 호이스트됩니다.스레드 중단이 발생하기 전에 실제로 시도가 입력된 경우 마지막은 항상 실행되며 스레드 중단으로 인해 중단되지 않습니다.
다음 시나리오에서는 가 실행되지 않습니다.
는입니다.예외.
2됩니다.NET 2.0부터는 스택 오버플로로 인해 프로세스가 종료됩니다.최종적으로 CER(제한된 실행 영역)로 만들기 위해 추가 제약 조건이 적용되지 않는 한 최종적으로 를 실행할 수 없습니다.CER는 일반 사용자 코드에서 사용하면 안 됩니다.모든 프로세스가 스택 오버플로에서 종료되고 모든 관리 개체가 기본적으로 정리된 후에는 정리 코드가 항상 실행되어야 하는 경우에만 사용해야 합니다.따라서 CER가 관련되어야 하는 유일한 위치는 프로세스 외부에 할당된 리소스(예: 관리되지 않는 핸들)입니다.
일반적으로 관리되지 않는 코드는 사용자 코드로 사용되기 전에 일부 관리되는 클래스에 의해 래핑됩니다.관리되는 래퍼 클래스는 일반적으로 SafeHandle을 사용하여 관리되지 않는 핸들을 래핑합니다.SafeHandle은 정리 코드의 실행을 보장하기 위해 CER에서 실행되는 중요한 마무리 및 릴리스 방법을 구현합니다.이러한 이유로 CER이 전체 사용자 코드에 흩어져 있지 않아야 합니다.
마지막으로 StackOverflow에서 실행되지 않습니다.프로세스는 어차피 종료되므로 예외는 사용자 코드에 영향을 미치지 않습니다.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.
}
다른 답변에서 언급하지 않은 매우 중요한 예외가 있으며 (18년 동안 C#에서 프로그래밍한 후) 제가 몰랐다는 것을 믿을 수 없습니다.
만약 당신이 당신의 내부에 어떤 종류의 예외를 던지거나 트리거한다면.catch
이상한게 )StackOverflowExceptions
그리고 그런 종류의 것들), 그리고 당신은 전체를 가지고 있지 않습니다.try/catch/finally
른사람내막다를부다 합니다.try/catch
의 록블, 당의신.finally
블록이 실행되지 않습니다.될 수 . 제가직접 보지 제가 를 볼 때, 정말 케이스들로 이은쉽입니다 - ▁this▁a▁that-▁really▁easily▁corner▁it▁is▁that▁-ated▁and,▁causecases입뿐▁can▁demonstr다니'▁tiny일스케이▁weird▁myself▁it코너작▁i이▁if▁how은것,고sfinally
실행하지 말라는 차단, 나는 믿지 않았을 것입니다.
static void Main(string[] args)
{
Console.WriteLine("Beginning demo of how finally clause doesn't get executed");
try
{
Console.WriteLine("Inside try but before exception.");
throw new Exception("Exception #1");
}
catch (Exception ex)
{
Console.WriteLine($"Inside catch for the exception '{ex.Message}' (before throwing another exception).");
throw;
}
finally
{
Console.WriteLine("This never gets executed, and that seems very, very wrong.");
}
Console.WriteLine("This never gets executed, but I wasn't expecting it to.");
Console.ReadLine();
}
여기에는 이유가 있을 것입니다만, 더 널리 알려져 있지 않다는 것이 이상합니다. (예를 들어, 이 특정 질문에서 언급된 것은 여기에 없습니다.)
파티에 늦었다는 것을 알지만 (OP의 예에서 발췌한) MSDN 상태(https://msdn.microsoft.com/en-us/library/zwc8s4fz.aspx) :"예외가 감지되지 않으면 운영 체제가 예외 해제 작업을 트리거하도록 선택하는지 여부에 따라 최종 블록의 실행이 달라집니다."
마지막 블록은 콜 스택의 상위에 있는 일부 다른 함수(예: 메인)에서 예외가 발생한 경우에만 실행됩니다.모든 런타임 환경(CLR 및 OS) C# 프로그램은 프로세스가 종료될 때 소유한 대부분의 리소스(파일 핸들 등)에서 실행되므로 일반적으로 이 세부 정보는 문제가 되지 않습니다.그러나 경우에 따라 중요할 수 있습니다. 응답을 커밋하려는 데이터베이스 작업이 절반 진행 중입니다.또는 OS에 의해 자동으로 닫히지 않고 서버를 차단할 수 있는 일부 원격 연결.
네. 그게 사실 최종 진술의 요점입니다.메모리가 부족하거나 컴퓨터가 분리된 등 심각한 문제가 발생하지 않는 한 최종 명령문은 항상 실행되어야 합니다.
또한 윈도우즈 서비스에서 호스팅되는 스레드에서 실행되고 감지되지 않은 예외에 대해서도 실행되지 않습니다.
윈도우즈 서비스에서 실행 중인 스레드에서 Finally가 실행되지 않음
System.exit(0)을 사용하여 응용 프로그램을 종료하는 경우 마지막으로 실행되지 않습니다.
try
{
System.out.println("try");
System.exit(0);
}
finally
{
System.out.println("finally");
}
결과는 그저: 시도하는 것일 것입니다.
는 시나의 99% 는코가 입니다.finally
블록이 실행되지만 다음 시나리오를 생각해 보십시오.다음과 같은 스레드가 있습니다.try
->finally
블록(아니오)catch
해당 되지 않은 합니다. 그러면 해당 스레드 내에서 처리되지 않은 예외가 발생합니다.이 경우 스레드가 종료되고 스레드가 종료됩니다.finally
블록이 실행되지 않습니다(이 경우 응용 프로그램이 계속 실행될 수 있습니다).
이 시나리오는 매우 드물지만, 답이 항상 "예"가 아니라는 것을 보여주기 위한 것입니다. 대부분의 경우 "예"이고 드문 경우에는 "아니오"가 되기도 합니다.
마지막으로 차단의 주요 목적은 내부에 기록된 모든 것을 실행하는 것입니다.그것은 시도나 캐치에서 무슨 일이 일어나느냐에 달려 있어서는 안 됩니다.그러나 시스템과 함께.환경.Exit (1) 응용 프로그램은 다음 코드 행으로 이동하지 않고 종료됩니다.
언급URL : https://stackoverflow.com/questions/345091/will-code-in-a-finally-statement-fire-if-i-return-a-value-in-a-try-block
'source' 카테고리의 다른 글
어레이 대 링크드 리스트 (0) | 2023.05.21 |
---|---|
경로가 주어지면 포함된 폴더 이름만 추출하려면 어떻게 해야 합니까? (0) | 2023.05.21 |
확인란 설정/해제 (0) | 2023.05.21 |
Node.js가 종료되기 직전 정리 작업 수행 (0) | 2023.05.21 |
기존 Git 저장소를 SVN으로 푸시 (0) | 2023.05.21 |