對於一個大的系統來說,異常處理必須要有一個總的策略和方針,並在組織內貫徹執行,否則就很難把異常處理好。
- 從整個系統全局的角度來看
- 進程內錯誤----用異常來報告錯誤(內部錯誤);底層模塊通過異常來向高層模塊報告錯誤的發生。
- 進程間錯誤----用ErrorCode, ErrorMessage, Action來向外部系統報告錯誤(業務錯誤),尤其是對外提供公共服務,除非是對外不公開的子系統,此時可以使用原生的異常來報告錯誤。一旦錯誤超出服務邊界,最好使用ErrorCode, ErrorMessage, Action的方式向外部報告。
- 從進程內不同模塊的角度來看
- 底層模塊:DLL,一般不需要Catch異常;盡量多的使用Try--Finally;除非定義的自己的異常。
- 高層模塊:EXE等,盡量在高層模塊中處理異常,報告錯誤。
- 從不同的系統類型的角度來講
- 服務型:7* 24小時,通常情況下要確保系統的任何情況下都不要Crash,系統發生的任何Exception都要有Log,有些情況下可能還需要發郵件來通知。
- UI型:友好的給出用戶提示信息。必要的時候可以使用AOP來在全局唯一的點來處理Exception。
- 實際的異常處理規則
- 異常類必須符合標准,必須可以序列化。
[Serializable]
public class ExampleException : ApplicationException
{
public ExampleException()
: base()
{
}
public ExampleException(string message)
: base(message)
{
}
public ExampleException(string message, Exception inner) :
base(message, inner)
{
}
protected ExampleException(SerializationInfo info, StreamingContext context) :
base(info, context)
{
}
} - 不能丟掉任何一個異常,通常情況下要使用InnerException來保持原始的異常。
try
{
//Read configuration from file
...
}
catch (FileNotFoundException ex)
{
throw new ExampleException("Can't find the configration file.", ex);
} - Catch異常后如果不Throw的話,必須Log異常。
- 記ExceptionLog時必須包含棧信息,也就是要使用ToString方法。