예외 처리
개요
개발자가 코드 예외 사항을 처리해 주지 않으면 처리되지 않은 예외 이벤트 핸들러가 발생하게 됩니다. 개발자들이 처리되지 않은 예외 핸들러를 구현하도록 권장하지만, 처리되지 않은 예외는 모든 경우에 Photon이 기록합니다.
상세 내용은 "처리되지 않은 예외 로깅"을 참고하세요.
Photon은 처리되지 않은 예외가 발생했을 때 두 가지 정책 중 하나의 정책을 지원합니다: Ignore 그리고 TerminateProcess.
예외 처리 정책이 CLR에 의해 재정의될 수 있는 다음과 같은 몇 가지 예가 있습니다:
- ThreadAbortException 프로세스를 반드시 다시 시작하거나 종료할 필요는 없습니다 - 관리된 스레드에서의 예외를 참고하세요.
- StackOverflowException은 무시될 수 없습니다 StackOverflowException Class를 참고하세요.
legacyUnhandledExceptionPolicy
) "에 설명되어 있는 관리된 쓰레드에서의 예외"는 애플리케이션 구성에서 Photon 이 지원하지 않습니다.
이 모드는 인스턴스별로 설정됩니다 (UnhandledExceptionPolicy = "Ignore"
) - see "처리되지 않은 예외 정책 구성".
Photon 5.0의 새로운 사항
"ReloadAppDomain" 정책은 오래된 정책으로 "Runtime" 노드에 대해 "UnhandledExceptionPolicy" 값은 더 이상 지원하지 않습니다.
"TerminateProcess" 정책은 아무것도 지정되어 있지 않으면 기본값이 되며, SDK에서 제공된 구성 파일에서도 기본값으로 설정됩니다.
UnhandledExceptionPolicies 의 사용에 대한 제안
Microsoft는 .NET 2.0에서 "TerminateProcess"를 기본 정책으로 도입하였으며 "관리된 스레드에서의 예외"에서 다음 성명서를 제시했습니다:
애플리케이션을 종료하지 않고 스레드가 그대로 실패하도록 허용되면 심각한 프로그래밍 문제가 감지되지 않을 수 있습니다. 이는 장기간 실행되는 서비스 및 기타 애플리케이션의 경우 특히 문제가 됩니다. 스레드가 실패하면 할수록 프로그램의 상태는 점점 더 손상됩니다. 애플리케이션 성능이 저하되거나 애플리케이션이 중단될 수 있습니다.
운영 체제가 프로그램을 종료할 때까지 스레드 내에서 처리되지 않은 예외를 그대로 진행되도록 허용하면 개발 및 테스트 중에 이러한 문제가 노출됩니다.
프로그램 종료에 대한 오류 리포트는 디버깅을 지원합니다.
그러나 프로젝트의 단계 또는 상황에 따라(개발 중, QA 단계, 알려진 문제가 없는 출시된 중에) Photon에서 지원하는 정책 중 하나를 사용하는 것을 고려할 수 있습니다:
- Ignore (무시)
- TerminateProcess (프로세스 종료)
개발
개발하는 동안 "TerminateProcess"로 설정을 해 놓으면 프로세스 종료 시 디버거/비주얼 스튜디오가 시작됩니다.
멀티 스레드 문제를 처리하고 계속 프로세스를 실행하고 애플리케이션이 로드되는 것을 선호하는 경우 "Ignore" 정책을 설정할 수도 있습니다.
QA
QA 단계에서 스트레스 테스트 또는 수동 테스트를 실행하는 동안 "TerminateProcess"를 사용하면 근본 오류로 인해 발생되는 파생되는 오류들이 넘쳐나지 않습니다.
안정적인 출시
서비스가 안정적이라고 가정할 때 "Ignore" 정책을 사용할 수 있습니다.
아주 드물게 처리되지 않은 예외의 경우 위험을 최소화하는 Photon에 의해 어플리케이션이 다시 시작됩니다.
이 방법은 시스템이 다시 가동되는 가장 빠른 방법입니다.
정책으로 "TerminateProcess" 서비스로서 Photon을 설정하고 Windows 서비스 기능 자동 재시작 보다 더 빠른 방법입니다.
노트: 이런 상황이 자주 발생하게 된다면 서비스 및 로그 파일을 모니터링해야 합니다.
알려진 문제가 있는 출시
시스템에 예기치 않은 예외가 자주 나타나고 수정할 시간이 필요한 경우 - 예외에 따라 정책을 "Ignore"로 설정하여 시스템을 적절하게 안정적으로 유지할 수 있습니다.
StackOverflows에 대한 주의
일반적으로 처리되지 않은 예외 동안 기록된 스택 트레이스에는 어디를 수정해야 하는지가 기록됩니다.
StackOverflowException은 처리되지 않은 예외 정책이 "Ignore"로 설정된 경우 스택 트레이스에서 나타나지 않을 수 있습니다.
디버깅 방법은 "Photon 서버 Stackoverflow" 페이지를 참조하세요.
코어 디버깅에 대한 노트
Photon 코어가 예기치 않은 예외를 발생시킨 드문 경우에는 "ProduceDump"를 TRUE
(Photon 코어 디버깅 참조)로 설정하는 것이 좋습니다.
당사로 생성된 덤프 파일과 로그를 보내면 문제를 해결하는 데 도움이 됩니다.
처리되지 않은 예외 로깅
아래 그림에 표시된 것처럼 처리되지 않은 예외 이벤트는 개발자가 c에 필요한 모든 방법으로 예외를 기록할 수 있는 사용자 지정 애플리케이션 (1)의 컨텍스트에서 먼저 발생합니다. 또한 LoadBalancing의 샘플 코드를 참조하십시오.
두 번째 단계에서 CLR은 기본 애플리케이션 도메인 (2) 에서 이벤트를 발생시킵니다. Photon의 경우 PhotonHostRuntime입니다. 따라서 Photon은 b)에서 예외를 기록할 수 있습니다.
Photon 로그 파일의 기본 경로/파일명:
- a) [$PhotonBaseDir]\bin_[$OS]\log\Photon-[$InstanceName]-[$date].log
- b) [$PhotonBaseDir]\bin_[$OS]\log\PhotonCLR.log
- c) [$PhotonBaseDir]\log\[$ApplicationName].log
UnhandledException 정책 구성하기
XML
<Runtime
Assembly="PhotonHostRuntime, Culture=neutral"
Type="PhotonHostRuntime.PhotonDomainManager"
UnhandledExceptionPolicy="TerminateProcess"/>
- UnhandledExceptionPolicy:
Ignore
또는TerminateProcess
.
Photon 코어 디버깅
XML
<!-- Instance settings -->
<Instance1
...
ProduceDumps = "TRUE"
DumpType = "Full"
MaxDumpsToProduce = "2"
...
서버가 비정상 종료되고 로그에서 그 이유를 찾을 수 없는 경우 덤프 파일을 생성하도록 Photon을 구성할 수 있습니다.
이 경우에 비정상 종료 상태와 메모리가 덤프 파일에 반영되므로 디버깅하는 데 매우 중요합니다.
덤프 파일이 작성되면 로그 파일들을 압축하여 문제에 대한 설명과 함께 저희에게 메일로 보낼 수 있습니다.
대부분의 경우, 더 많은 정보를 얻고 사건을 해결하기 위해 연락을 드릴 예정입니다.
- ProduceDumps:
TRUE
또는FALSE
. 비정상 종료시 "덤프 파일" 생성을 활성화 또는 비활성화로 전환합니다.
Photon 코어에서 문제점을 찾기 위해서 덤프 파일을 필수입니다. - DumpType: 덤프 파일에 작성할 비정상 종료 유형을 정의합니다.
Full
또는Maxi
또는Mini
차례대로 더 많은 정보가 포함되며 더 많은 저장 공간이 필요합니다. - MaxDumpsToProduce: 최대 기록 덤프 파일 수를 구성합니다.
파일을 이동하거나 삭제하면 새 파일을 쓸 수 있습니다. - MaxDumpsToAttemptToProduce: 최대 덤프 파일 생성 시도를 구성합니다.