This page is a work in progress and could be pending updates.
server | v5 switch to v4  

例外処理

Contents

概要

ディベロッパーのコードで処理されない例外は、常に未処理例外イベントハンドラーを発生させます。 弊社は、未処理例外ハンドラーを実装するようディベロッパーに推奨しています。しかし、すべての場合において未処理例外はPhotonによってログされます。 詳細は、「未処理例外のロギング」を参照してください。 Photonは未処理例外が発生すると、以下の2つのポリシーのいずれかをサポートします:IgnoreTerminateProcess です。

一部のケースでは、例外処理ポリシーよりもCLRが優先される可能性があります、たとえば:

注:Exceptions in Managed Threads」に記載された「アプリケーション互換性フラグ」(legacyUnhandledExceptionPolicy)は、アプリケーションの設定によってはPhotonがサポートしていません。 このモードはインスタンス(UnhandledExceptionPolicy = "Ignore") ごとに設定されますー「UnhandledException Policyの設定」を参照してください。

Back To Top

Photon 5.0での新機能

ReloadAppDomain」ポリシーは旧形式となり、「Runtime」ノードの「UnhandledExceptionPolicy」値としてはもうサポートされていません。 何も指定されない場合には、「TerminateProcess」がデフォルト値となります。また、この値はSDKに配信される設定ファイル内に設定される値となります。

Back To Top

UnhandledExceptionPolicies使用の提案

Exceptions in Managed Threads」からの以下の引用のとおり、Microsoftは「TerminateProcess」を.NET 2.0での新たなデフォルトポリシーとして導入しました。

スレッドの暗黙的な失敗が許可されている場合、 アプリケーションを終了しないと深刻なプログラミングの問題を検出できない場合があります。 これは長時間実行されるサービスや他のアプリケーション固有の問題です。スレッドが失敗すると、プログラムの状態は徐々に破損します。 これによって、アプリケーションのパフォーマンスが低下したり、 アプリケーションがハングアップすることがあります。

オペレーティングシステムがプログラムを終了するまでに未処理の例外をスレッドで自然に進行させると、開発およびテスト中にこのような問題が発生します。 プログラム終了のエラーレポートは、デバッグをサポートしています。

ただし、プロジェクトの段階や状況(開発中、QA中、既知の問題がなく本番で稼働中など)に応じて、Photonがサポートする様々なポリシーのいずれかを適用すると良いかもしれません。

  • Ignore
  • TerminateProcess

Back To Top

開発

開発中に「TerminateProcess」を設定すると、処理終了中にデバッガ/visual studioが起動します。 マルチスレッド問題を処理する場合には、処理を実行し続けてアプリケーションを読み込んでから、ポリシー「Ignore」を適用したほうがよいでしょう。

Back To Top

QA

QA段階の場合には、負荷テストや手動テストの際に「TerminateProcess」を使用すればルートエラーに起因する多くのエラーを受信せずにすみます。

Back To Top

本番環境で安定して稼働

サービスが安定している場合に、適用を考慮できるポリシーは「Ignore」です。 稀に発生する未処理例外のイベントによって、Photonはアプリケーションを再起動し、リスクを最小化します。 これが、システムの再稼動を最短で実現するための方法です。 「TerminateProcess」 ポリシーでPhotonをサービスとしてセットアップし、またWindowsサービス機能を自動的に再起動するよりも早く再起動できます。

注: この事象がより頻繁に発生する場合には、サービスおよびログファイルを監視する必要があります。

Back To Top

既知の問題があり、本番環境で稼動

システムが予期せぬ例外を頻繁に表示し、修正に時間を要する場合ー例外の内容によりますが、ポリシーを「Ignore」に設定すればシステムの安定性を維持できる場合があります。

StackOverflowsについての注

通常、未処理の例外の際にログを記録されたスタックトレースによって、修正すべき点を把握できます。 StackOverflowException とは、未処理の例外のポリシーが「Ignore」に設定されて、スタックトレースが欠損した可能性がある状態を指します。 デバッグの手順については、「Photon ServerのStackoverflow」ページを参照してください。

コアのデバッグについての注

稀に、Photonコアによって予期せぬ例外が発生する場合があります。この場合には、設定「ProduceDump」をTRUEに設定してください (Photon Coreのデバッグを参照してください)。 生成されたダンプファイルとログを弊社に送信いただければ、問題の修正に役立つ場合があります。

Back To Top

未処理例外のロギング

下図に示したとおり未処理例外イベントは、まずカスタムアプリケーションのコンテキスト(1)で発生します。ディベロッパーは希望する方法で、 例外をc)にロギングできます。 また、ロードバランシングのサンプルコードも参照できます。 次のステップで、CLRはデフォルトのアプリケーションドメインでイベントを発生させます(2)。ーこれは、Photonの場合はPhotonHostRuntimeです。このためPhotonは、b)に例外をログすることができます。

Photon Server: logging unhandled exceptions
Photon Server: 未処理例外のロギング

Photonログファイルのデフォルトパス/ファイル名:

  • a) [\$PhotonBaseDir]\bin_[\$OS]\log\Photon-[\$InstanceName]-[\$date].log
  • b) [\$PhotonBaseDir]\bin_[\$OS]\log\PhotonCLR.log
  • c) [\$PhotonBaseDir]\log\[\$ApplicationName].log

Back To Top

UnhandledExceptionポリシーの設定

    <Runtime
      Assembly="PhotonHostRuntime, Culture=neutral"
      Type="PhotonHostRuntime.PhotonDomainManager"
      UnhandledExceptionPolicy="TerminateProcess"/>
  • UnhandledExceptionPolicy: Ignore または TerminateProcess.

Back To Top

Photonコアのデバッグ

   <!-- Instance settings -->
    <Instance1
        ...
        ProduceDumps = "TRUE"
        DumpType = "Full"
        MaxDumpsToProduce = "2"
        ...
  • ProduceDumps: TRUEまたはFALSE
  • DumpType: FullまたはMaxiまたは Mini

To Document Top