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

Exception Handling

Contents

概述

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

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

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

Back To Top

Photon 5.0的新功能

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

Back To Top

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

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

Back To Top

開發

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

Back To Top

QA

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

Back To Top

運行穩定

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

Back To Top

在已知的問題下運行

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

Note on StackOverflows

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

Note on Debugging Core

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

Back To Top

記錄未處理之異常情況

如下圖所示,未處理的異常事件首先在自定義應用程序(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

Back To Top

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

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

Back To Top

Photon Core 除錯

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

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

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

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

To Document Top