시도 - 캐치 :catch에서 마지막으로 throw 된 예외입니다. 대 CLR 행동 나는 간단한 C# 콘솔 응용 프로그램을 작성 블록
class Mystery
{
static void Main(string[] args)
{
MakeMess();
}
private static void MakeMess()
{
try
{
System.Console.WriteLine("try");
throw new Exception(); // let's invoke catch
}
catch(Exception)
{
System.Console.WriteLine("catch");
throw new Exception("A");
}
finally
{
System.Console.WriteLine("finally");
throw new Exception("B");
}
}
}
콘솔에 주어진 출력은 다음과 같습니다
이
캐치
처리되지 않은 예외를 시도 : System.Exception : A에서 Mystery.Program.MakeMess() ...
CLR이 A에 걸렸으며 finally 블록이 전혀 호출되지 않은 것으로 보입니다. 내가 시도-catch 블록으로 MakeMess()로 전화를 서라운드
는하지만 :
static void Main(string[] args)
{
try
{
MakeMess();
}
catch(Exception ex)
{
System.Console.WriteLine("Main caught " + ex.Message);
}
}
는 출력은 완전히 다른 같습니다
시도
캐치
마지막으로
메인 잡힌 B
Exception이 메소드 외부에서 엄격하게 처리 될 때 MakeMess()에서 전파되는 Exception이 다른 것처럼 보입니다.
이 동작에 대한 설명은 무엇입니까?
컴파일러 외부에서 실행하면 어떻게됩니까? 나는 마침내 쓰여질 것이라고 가정한다. – TheLethalCoder
http://stackoverflow.com/a/1555578/613130를 참조한다. * 중요한 것은 e가 호출 스택 위로 try/catch 블록에 의해 포착되지 않거나 전역 적으로 처리된다면 예외 처리기를 호출하면 finally 블록이 전혀 실행되지 않을 수 있습니다. * – xanatos
catch 내에서 예외를 catch하지 않았습니다. 프로그램이 중지됩니다. 완전히 실패했을 때 계속할 이유가 없습니다. 당신의 초의 예에서는 try catch가 중첩 된 것과 같습니다. 바깥 쪽 시도는 내부 catch의 예외를 catch합니다. 그러나 그 전에 마침내 호출됩니다. –