Exception Handling
概述
沒有被開發者代碼處理的異常,總是會引發未處理的異常事件處理程序。
我們鼓勵開發者執行未處理的異常處理程序,但在任何情況下,未處理的異常都會被Photon記錄下來。
詳見"記錄未處理的異常"。
Photon在出現未處理的異常時支持兩種策略之一:Ignore和TerminateProcess。
在一些情況下,異常處理策略可能會被CLR覆寫,例如:
- ThreadAbortException不一定會重啟或結束進程-見Exceptions in Managed Threads。
- StackOverflowException不能被忽略--見StackOverflowException類。
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日誌文件的默認路徑/文件名:
- 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"/>
- UnhandledExceptionPolicy:
Ignore
或TerminateProcess
。
Photon Core 除錯
XML
<!-- Instance settings -->
<Instance1
...
ProduceDumps = "TRUE"
DumpType = "Full"
MaxDumpsToProduce = "2"
...
如果一個伺服器崩潰了,而且在日誌中找不到原因,Photon可以被配置為創建轉儲文件。
這些文件反映了崩潰時的狀態和內存,對於除錯這些情況是非常有價值的。
一旦寫好轉儲文件,您可以把它和日誌一起壓縮,然後把它和問題的描述一起寄給我們。
在大多數情況下,我們會與您取得聯系,以獲得更多的信息並解決該案例。
- ProduceDumps:
TRUE
或FALSE
。切換到啟用或禁用在崩潰情況下創建 "轉儲文件"。
轉儲文件對於發現Photon核心的問題至關重要。 - DumpType:定義要寫入的崩潰轉儲文件的類型。
這些類型是Full
或Maxi
或Mini
,它們包括從頭到尾較少的信息,但也需要較少的存儲空間。 - MaxDumpsToProduce:配置最大寫入多少個轉儲文件。
如果文件被移動或刪除,新的文件可以被寫入。 - MaxDumpsToAttemptToProduce:配置最大的轉儲文件創建嘗試。