This document is about: SERVER 5
SWITCH TO

This page is a work in progress and could be pending updates.

Exception Handling

概述

沒有被開發者代碼處理的異常,總是會引發未處理的異常事件處理程序。
我們鼓勵開發者執行未處理的異常處理程序,但在任何情況下,未處理的異常都會被Photon記錄下來。
詳見"記錄未處理的異常"。
Photon在出現未處理的異常時支持兩種策略之一:IgnoreTerminateProcess

在一些情況下,異常處理策略可能會被CLR覆寫,例如:

注意:"應用程序兼容性標志" (legacyUnhandledExceptionPolicy),在"主持線程中的異常"中描述,Photon 不支持每個應用程序的配置。 這種模式是按實例設置的(UnhandledExceptionPolicy = "Ignore")-見"Configuring the UnhandledException Policy" 。

Photon 5.0的新功能

"ReloadAppDomain"策略已經過時,不再支援作為 "Runtime"節點的 "UnhandledExceptionPolicy"值。
"TerminateProcess"現在是默認值,如果沒有指定,它也是SDK中配置文件中設置的值。

對未處理異常政策的使用建議

Microsoft introduced the "TerminateProcess" as new default policy with .NET 2.0 with following statement quoted from "Exceptions in Managed Threads":

當線程被允許失敗時無警示,而不終止應用程序時,嚴重的編程問題就會不被發現。 這對服務和其他長時間運行的應用程序來說是一個特別的問題。 隨著線程的失敗,程序狀態逐漸被破壞。 應用程序的性能可能會下降,或者應用程序可能會單吊。

允許線程中未處理的異常自然進行,直到操作系統終止程序,這在開發和測試期間暴露了此類問題。
程序終止時的錯誤報告支援調試。

但根據您的項目所處的階段或情況(開發中、QA中、沒有已知問題的LIVE等),您可以考慮使用Photon支援的不同策略之一:

  • Ignore
  • TerminateProcess

開發

在開發過程中,設置 "TerminateProcess"可以在進程終止時啟動調試器/視覺工作室。
如果您正在處理一個多線程的問題,您可能希望保持進程的運行和應用程序的加載,那麼設置策略 "Ignore"將是您所希望的。

QA

在QA階段,無論是壓力測試還是手動測試,使用 "TerminateProcess"可以確保您不會被來自根源錯誤的錯誤所淹沒。

運行穩定

假設您的服務是穩定的,您可以考慮使用的策略是 "Ignore"。
在極少數情況下,如果出現未處理的異常,應用程序將由Photon重新啟動,從而將風險降到最低。
這是系統重新啟動的最快方式。
這比將Photon設置為服務,並將 "TerminateProcess " 作為策略和自動重啟Windows服務功能更快。
Note: 您應該監控您的服務和日誌文件,以防這種情況經常發生。

在已知的問題下運行

如果系統經常顯示一個意外的異常,並且您需要時間來修復-根據異常情況,通過將策略設置為 "Ignore",也許可以保持一個合理的穩定系統。

Note on StackOverflows

通常情況下,在未處理異常期間記錄的堆棧跟蹤將指出您的修復方法。
如果未處理異常策略被設置為 "Ignore",那麼StackOverflowException的情況下,堆棧跟蹤會丟失。
參見"Photon Server Stackoverflow "頁面,了解如何調試它的步驟。

Note on Debugging Core

對於Photon核心引發意外異常的罕見情況,我們建議將 "ProduceDump "設置為TRUE(參見"Photon核心調試")。
將生成的轉儲文件和日誌發送給我們,將有助於我們解決這個問題。

記錄未處理之異常情況

如下圖所示,未處理的異常事件首先在自定義應用程序(1)的上下文中被引發,開發者可以以任何方式記錄該異常-也可以參考LoadBalancing的示例代碼。
在第二步中,CLR會在默認的應用程序域(2)中引發該事件-在Photon中是指PhotonHostRuntime。因此,Photon能夠記錄b)中的異常。

Photon 伺服器:記錄未處理的異常情況
Photon 伺服器:記錄未處理的異常情況

Photon日誌文件的默認路徑/文件名:

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

配置未處理之異常情況策略

XML

    <Runtime
      Assembly="PhotonHostRuntime, Culture=neutral"
      Type="PhotonHostRuntime.PhotonDomainManager"
      UnhandledExceptionPolicy="TerminateProcess"/>
  • UnhandledExceptionPolicyIgnoreTerminateProcess

Photon Core 除錯

XML

   <!-- Instance settings -->
    <Instance1
        ...
        ProduceDumps = "TRUE"
        DumpType = "Full"
        MaxDumpsToProduce = "2"
        ...

如果一個伺服器崩潰了,而且在日誌中找不到原因,Photon可以被配置為創建轉儲文件。
這些文件反映了崩潰時的狀態和內存,對於除錯這些情況是非常有價值的。

一旦寫好轉儲文件,您可以把它和日誌一起壓縮,然後把它和問題的描述一起寄給我們。
在大多數情況下,我們會與您取得聯系,以獲得更多的信息並解決該案例。

  • ProduceDumpsTRUEFALSE。切換到啟用或禁用在崩潰情況下創建 "轉儲文件"。
    轉儲文件對於發現Photon核心的問題至關重要。
  • DumpType:定義要寫入的崩潰轉儲文件的類型。
    這些類型是FullMaxiMini,它們包括從頭到尾較少的信息,但也需要較少的存儲空間。
  • MaxDumpsToProduce:配置最大寫入多少個轉儲文件。
    如果文件被移動或刪除,新的文件可以被寫入。
  • MaxDumpsToAttemptToProduce:配置最大的轉儲文件創建嘗試。
Back to top