내 응용 프로그램에 백그라운드 스레드가 있습니다. 스레드 중 하나가 처리되지 않은 예외를 가져 오면 전체 CLR이 종료됩니다.스레드에서 처리되지 않은 예외가 발생하면 CLR이 종료됩니다.
정상적인 동작입니까, 아니면 CLR의 버그입니까?
스레드가 종료되지만 CLR이 계속 작동 할 것으로 예상됩니다.
내 응용 프로그램에 백그라운드 스레드가 있습니다. 스레드 중 하나가 처리되지 않은 예외를 가져 오면 전체 CLR이 종료됩니다.스레드에서 처리되지 않은 예외가 발생하면 CLR이 종료됩니다.
정상적인 동작입니까, 아니면 CLR의 버그입니까?
스레드가 종료되지만 CLR이 계속 작동 할 것으로 예상됩니다.
정상적인 동작입니다. 아마도 응용 프로그램이 종료되지 않도록 예외를 잡기를 원할 것입니다.
예 그렇습니다. 자세한 내용은이 유사 question을 참조하십시오.
이것은 CLR v2.0의 일반적인 동작입니다. 여기에 MSDN 게시물이 있습니다. 프로세스가 종료되는 것을 피하기 위해 다음과 같은 것을 사용할 수 있습니다.
<legacyUnhandledExceptionPolicy enabled="1"/>
권장하지 않습니다.
기대했던 동작은 이전 1.1의 동작이었습니다. 일반적으로 나쁜 생각이었습니다. 모든 스레드에서 처리되지 않은 예외가 발생하면 프로세스가 일관성없는 상태로 유지 될 수 있습니다. 공유 데이터에 대한 업데이트가 부분적으로 적용될 수 있습니다. 런타임에는이 시나리오를 안전하게 처리하거나이 시나리오를 어떻게 처리할지 알 수있는 정보가 없으므로 스레드를 종료하고 프로그램을 종료하는 데 더 많은 돈을 씁니다. 이상한 상태. 이로 인해 리소스 누출, 중단, 데이터 손상 등이 발생할 수 있습니다. 처리되지 않은 예외가있는 프로세스를 종료하면 프로세스가 종료됩니다. 프로세스가 종료됩니다.
.NET 응용 프로그램의 기본 동작은 처리되지 않은 예외가 발생할 때마다 종료됩니다. 예외가 처리되지 않으면 프로그램이 알 수없고 불안정한 상태가됩니다. 백그라운드 스레드에서 발생했기 때문에 오류가 나머지 프로그램에 영향을 미치지는 않습니다. 그 상황에서 런타임을위한 가장 신중한 과정은 프로그램을 덤프하는 것입니다.
AppDomain.CurrentDomain.UnhandledException
을 살펴보면 처리되지 않은 예외를 잡아 내고 그에 따라 대응할 수 있습니다. 더 나은 해결책은 스레드 proc을 try...catch
으로 감싸는 것입니다. 그러나 처리하는 방법을 알고있는 예외 만 처리해야합니다. 이렇게 : 당신이 정말 메인 프로그램으로 전파 할 않는 예외를 마스크 할 수 있기 때문에
void MyThreadProc()
{
try
{
// ...
}
catch
{
// handle all exceptions
// This is a BAD idea
}
}
는 정말 좋은 생각입니다.