액터에서 발생할 수 있는 예외는 두 가지 유형이 있다:
일반적인 try-catch나 다른 언어와 표준 라이브러리 도구로 처리할 수 있는 예상되는 예외
예를 들어 네트워크 리소스를 사용할 수 없거나, 디스크 쓰기가 실패하거나, 아니면 애플리케이션 로직에 버그가 있을 수 있다.
감독은 실패를 처리하며, 비즈니스 로직과는 별도로 유지되어야 한다.
데이터 유효성 검사와 예상되는 예외 처리는 비즈니스 로직의 중요한 부분이다.
따라서 감독은 액터의 메시지 처리 로직과 섞이지 않고 추가된다.
액터를 계속 실행하면서 내부 상태를 유지
액터를 다시 시작하면서 내부 상태를 초기화하고, 다시 시작할 때 잠재적인 지연이 있을 수 있다
액터 영구 중지
액터들이 계층 구조의 일부이기 때문에, 모든 자식 액터가 예상치 못하게 중지되면,
액터 자체가 재시작하거나 중지하여 기능 상태로 돌아갈 수 있다.
이는 감독과 자식을 모니터링 하는것을 조합하면 가능하다.
액터 시스템은 생성 중에 적어도 두 개의 액터를 시작함
/user: 사용자 보호자 액터/system: 시스템 보호자(가디언) 액터특정 메시지 처리 중에 실패한 액터가 있을 경우, 실패의 원인은 세 가지 범주로 나뉜다.
특정 메시지에 대한 시스템적인 (즉, 프로그래밍) 오류
메시지 처리 중에 일시적으로 실패한 외부 리소스
액터 내부 상태의 손상
특별한 상황이 아니라면, 액터의 내부 상태가 문제를 일으켰다고 판단할 수 있는 세 번째 이유를 무시할 수 없다. 이로 인해 액터의 내부 상태를 초기화해야 한다. 감독자가 다른 하위 액터나 자기 자신이 이러한 문제로부터 영향을 받지 않을 것이라고 판단한다면—예를 들어 오류 처리 전략을 의도적으로 사용한 경우—액터를 재시작하는 것이 최선이다. 이렇게 하려면 기본 'Behavior' 클래스의 새로운 인스턴스를 생성하여 실패한 액터 인스턴스를 새로운 것으로 교체해야 한다. 새 액터는 이후 메시지 처리를 재개하는데, 이 과정은 액터를 사용하는 외부에서는 거의 눈에 띄지 않는다. 단, 오류를 일으킨 메시지는 다시 처리되지 않는 예외가 있다.
생명주기 모니터링은 Terminated 메시지를 사용하여 모니터링하는 액터에 의해 구현된다.
액터가 메시지를 처리하는 동안 일종의 예외가 발생할 수 있다.
메시지 처리 중 예외가 발생하면, 이 메시지는 손실된다.
메시지 처리 중 예외가 발생하면 메일박스에는 아무 일도 일어나지 않는다.
액터 내의 코드에서 예외가 발생하면, 그 액터는 일시 중지되고 감독 과정이 시작된다.
참조