異常展示
系統異常模塊除了記錄功能,還有一個很重要的功能:異常展示,即系統發生異常後,展示給用戶怎樣的頁面。展示給用戶友好頁面具有以下必要性:
展示給用戶友好頁面,可以降低用戶焦慮感,提高用戶體驗。
將系統異常隱藏,避免代碼、路徑等技術信息外洩,提高系統安全性。
將系統運行時異常統一管理,有助於提高軟件整體質量,便於整體把控。
友好頁面的展示類型也是根據配置節點信息完成的,管理員只需更改配置節點中的枚舉值,即可改變用戶體驗頁面,用戶體驗頁面共有10中方式,分別是拋出原始異常信息、拋出定制異常信息、拋出簡單信息(不包含異常)以及隱藏異常信息等方式。
在系統開發階段,可以使用拋出原始異常信息的展現方式,系統部署後,可以使用拋出簡單信息(不包含異常)或隱藏異常信息的方式,選擇這些展示方式的同時,還可以選擇是否記錄到日志介質。
各種異常展示的配置信息大全,假如有一個頁面代碼如下:
代碼
try
{
string i = "i";
Response.Write(i);
}
catch (Exception ex)
{
ILException ile = new ILException();
ile.WriteLog(ex);
}
正常訪問頁面顯示字符串“i”,假如代碼修改如下,便會發生錯誤:
代碼
try
{
string i = "i";
Response.Write(Convert.ToInt32(i));
}
catch (Exception ex)
{
ILException ile = new ILException();
ile.WriteLog(ex);
}
根據以下不同配置信息,頁面有不同的顯示,這個顯示方式根據web.config給出的鍵值決定:
<add key="IsLine.ExceptionProcess.Configuration.ProcessStyle" value="ThrowOriginalWithLog"/>
其中,value可以為以下枚舉值:
ThrowOriginalWithLog
這種方式的含義是拋出原始錯誤,終止應用程序,並將這種錯誤記錄到異常日志中。
圖1 原始錯誤
2.ThrowOriginalWithoutLog
這種方式的含義只是拋出原始錯誤,終止應用程序,並不記錄這種錯誤,圖示同上。
3.ThrowFriendlyWithLog
這種方式的含義是拋出友好的錯誤信息,終止應用程序,並記錄異常。友好異常信息由自己定義。
圖2 拋出友好信息
4.ThrowFriendlyWithoutLog
這種方式的含義是拋出友好的錯誤信息,終止應用程序,並不記錄異常,圖示同上。
需要注意的是,使用3、4兩種配置,需要在web.config中添加額外的節點信息,這些信息決定了友好信息的顯示字段與排版:
在<configSections></configSections>中添加以下信息
<sectionGroup name="IsLine.ExceptionProcess.Configuration">
<section name="ILExceptionModel" type="IsLine.Data.Configuration.SuitConfig" />
</sectionGroup>
在</configSections><appSettings>之間加入以下信息
代碼
<IsLine.ExceptionProcess.Configuration>
<ILExceptionModel>
<Message>->Message:@Message</Message>
<Level>->Level:@Level</Level>
<HelpLink>->Helper:@HelpLink</HelpLink>
<Source>->Source:@Source</Source>
<StackTrace>->Stack Trace:@StackTrace</StackTrace>
<TargetSite>->Trigger:@TargetSite</TargetSite>
<HResult>->Result Code:@HResult</HResult>
<EventDate>->Event Date:@EventDate</EventDate>
<OtherPlus>->Contact Method:</OtherPlus>
</ILExceptionModel>
</IsLine.ExceptionProcess.Configuration>
5.ThrowSimpleWithLog
這種方式的含義是拋出簡單的預定義的錯誤信息,終止應用程序,並記錄異常。
圖3 拋出簡單預定義信息
這些預定義信息由以下節點定義,value部分就是頁面顯示的信息:
<add key="IsLine.ExceptionProcess.ExceptionProcessProvider.FriendlySimpleText" value="The current page has an exception!"/>
6.ThrowSimpleWithoutLog
這種方式的含義是拋出簡單的預定義的錯誤信息,終止應用程序,並不記錄異常,圖示同上。
7.ShowSimpleWithLog
這種方式的含義是顯示簡單的預定義的錯誤信息,不終止應用程序,並記錄異常。
這種方式顯示錯誤信息與5、6相同,但是5、6配置形式,如果程序中遇到錯誤則會觸發“throw”,從而導致程序終止運行;而7、8怎會顯示錯誤,程序繼續運行。
8.ShowSimpleWithoutLog
這種方式的含義是顯示簡單的預定義的錯誤信息,不終止應用程序,並不記錄異常。
9.HideWithLog
這種方式的含義是不顯示任何錯誤信息,不終止應用程序,並將異常信息記錄。
10. HideWithoutLog
這種方式的含義是不顯示任何錯誤信息,不終止應用程序,並不記錄異常信息。
注意,異常的記錄是日志模塊可以理解為繼承的關系,日志模塊的緩存等特性配置,在異常中仍有效。
至於,異常信息被寫到什麼地方,正如我們前面所說到的,它是由日志的Render決定的:
<add key="IsLine.ExceptionProcess.Configuration.RenderName" value="OracleUsingSPRender"/>
“OracleUsingSPRender”便是日志的Render名稱, Render模型描述了異常記錄位置、格式等信息,詳細請見
IsLine FrameWork系列之八--ExceptionProcessProvider異常框架(上) 中的第三點。
超級異常日志
如果在異常記錄的過程中,發生錯誤,這時異常信息不會記錄成功,異常信息自動被忽略,如果管理員希望在日志模塊出現錯誤時,ILFW仍然記錄這些信息,管理員可以打開配置文件中“超級日志”的開關。
當此開關打開後,如果日志模塊出現錯誤(例如數據庫連接中斷),ILFW會自動將當前信息記錄至一個文本文件中,直到導致日志模塊錯誤的因素消失。
在web.config中添加以下節點開啟超級日志功能:
<add key="IsLine.ExceptionProcess.ExceptionProcessProvider.IsOpenDebugInfo" value="True" />
以下節點表示超級日志記錄位置:
<add key="IsLine.ExceptionProcess.ExceptionProcessProvider.DebugInfo" value="C:\IsLineLog\FinallyLog.txt" />
注意,超級日志只能寫入文本文件,並且使用超級日志需要確保相關賬戶對日志文件具有完全控制權限。