다른 스레드에서 발생한 예외 잡기: 종합 가이드
이 문서에서는 호출과 별도의 스레드에서 발생한 예외를 캡처하는 일반적인 문제를 다룹니다. 방법. 메서드(Method1)가 새 스레드를 생성하고 해당 스레드(Method2)에서 실행되는 동안 예외가 발생하면 문제가 발생합니다. 문제는 이 예외 정보를 Method1로 다시 전송하는 것입니다.
해결책
.NET 4 이상 버전에서는 Task
1. 작업 스레드에서 별도의 예외 처리
이 접근 방식에서는 다음 코드 조각에서 볼 수 있듯이 작업 스레드에서 예외를 처리할 수 있습니다.
class Program { static void Main(string[] args) { Task<int> task = new Task<int>(Test); task.ContinueWith(ExceptionHandler, TaskContinuationOptions.OnlyOnFaulted); task.Start(); Console.ReadLine(); } static int Test() { throw new Exception(); } static void ExceptionHandler(Task<int> task) { var exception = task.Exception; Console.WriteLine(exception); } }
2. 호출자 스레드에서 예외 처리
또는 다음 코드를 사용하여 호출자 스레드에서 예외를 처리할 수 있습니다.
class Program { static void Main(string[] args) { Task<int> task = new Task<int>(Test); task.Start(); try { task.Wait(); } catch (AggregateException ex) { Console.WriteLine(ex); } Console.ReadLine(); } static int Test() { throw new Exception(); } }
획득된 예외는 AggregateException 유형입니다. ex.InnerExceptions에 저장된 실제 예외 property.
.NET 3.5 솔루션
.NET 3.5에는 두 가지 접근 방식이 있습니다.
1. 자식 스레드에서의 예외 처리
class Program { static void Main(string[] args) { Exception exception = null; Thread thread = new Thread(() => SafeExecute(() => Test(0, 0), Handler)); thread.Start(); Console.ReadLine(); } private static void Handler(Exception exception) { Console.WriteLine(exception); } private static void SafeExecute(Action test, Action<Exception> handler) { try { test.Invoke(); } catch (Exception ex) { Handler(ex); } } static void Test(int a, int b) { throw new Exception(); } }
2. 호출자 스레드의 예외 처리
class Program { static void Main(string[] args) { Exception exception = null; Thread thread = new Thread(() => SafeExecute(() => Test(0, 0), out exception)); thread.Start(); thread.Join(); Console.WriteLine(exception); Console.ReadLine(); } private static void SafeExecute(Action test, out Exception exception) { exception = null; try { test.Invoke(); } catch (Exception ex) { exception = ex; } } static void Test(int a, int b) { throw new Exception(); } }
위 내용은 .NET의 별도 스레드에서 발생한 예외를 어떻게 잡을 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!