1

다른 스레드의 한 스레드에서 발생하는 예외를 catch 할 수 있습니까? 예를 들어, 내 스레드에서 스레드를 생성하고 있습니다. 생성 된 스레드가 catch되지 않는 예외를 throw 할 수 있습니다. 산란 스레드가 이러한 예외를 잡을 수 있습니까?Objective-C에서 다른 스레드의 한 스레드에서 예외가 발생하면 catch 할 수 있습니까?

하나의 해결책은 생성 된 스레드의 진입 점에서 예외를 catch하고 NSNotification을 게시하여 예외를 처리하는 것입니다. 그런 다음 생성 스레드는 NSNotification을 수신 할 수 있습니다. 그러나이 솔루션은 기본적으로 다른 유형의 NSException이 주어진 @catch 절을 매개 변수로 다시 구현하기 때문에 약간 코키 감이 있습니다. 다른 해결책이 있는지 확인하고 싶었습니다.

+2

예외는 iOS/Mac OS X *에서 복구 할 수없는 오류를 나타내는 데에만 사용됩니다. 복구 할 수있는 항목에 대한 예외를 사용하고 있다면 잘못 처리하고있는 것입니다. – bbum

+1

복구 할 수없는 오류에 대해서만 예외를 사용하는 것은 관습 *이며 그 자체가 잘못되지 않습니다 *. Obj-C (b) 리소스 누수 (b2) 메모리 누수에서 잘 수행되지 않는 예외를 사용하는 데는 세 가지 공통적 인 반대가 있습니다. (a) 어쨌든해야하는 예외적 인 상황에서만 사용하면 완화됩니다. (b) 언어와 무관 한 예외 기반 설계로 처리해야하며, (b2) (b)의 하위 집합은 가비지 콜렉션, Obj-C++의 ARC 또는'-fobjc-arc-exceptions'을 사용하는 Obj-C의 ARC를 지원합니다. 따라서 예외를 올바르게 사용하면 "잘못하고있는 것"이 ​​아닙니다. 귀하의 질문에 @Seva를 참조하십시오. – CRD

+0

@bbum 이는 "복구 할 수없는"상황입니다. –

답변

3

불가능하고 무의미합니다. 던지는 스레드는 생성 스레드가 현재 try 블록 내에서 실행 중인지 알 수 없습니다. 그렇지 않다면, 그것은 무엇을 할 것입니까? 스폰서가 붙잡을 때까지 던지기를 연기합니까? 그것이 결코 안되면?

다른 시나리오를 고려하십시오. Spawner 스레드가 무언가를하고 일직선 상에 있지 않은 상황에서 작업자 스레드에서 예외가 발생합니다. 예를 들어 일부 데이터 구조를 업데이트하는 중입니다. 예외는 실행 흐름을 중단시키고 데이터를 일관성없는 상태로 둡니다. 말할 것도없이 스폰서가하고있는 다른 훌륭한 일은 영원히 불완전하게 남아 있습니다.

올바른 방법은 작업자 스레드의 최상위 레벨을 잡고, [NSObject performSelector:]과 같은 것을 사용하여 spawner 스레드로 전달하는 것입니다. Spawnner가 Spawnee에서 booboos에 대해 통보 받아야한다는 일반적인 견해는 확실하지만 Spawnner에 spawnee의 예외를 던지는 것은 옳지 않습니다. 참고 - 코코아가 제공하는 다른 메커니즘을 거치지 않고 "throwing"이라고 말했습니다.

+0

아무 것도 할 필요가 없습니다. try 블록이 스택의 어딘가에 존재 하는지를 모른 채 예외를 던질 수 있습니다. –

+1

+1 예외는 스택 기반 메커니즘이며 모든 스레드는 자체 스택을 가지고 있습니다. 할 수있는 일은 스레드에서 예외를 제거하고 정보를 알리는 것입니다. –

+0

잡히지 않은 예외가 프로세스를 중단시킵니다. 그것이 원하는 결과입니까? –

관련 문제