我現在用下面的代碼捕獲錯誤,在我服務層拋出異常:這是一種捕捉和處理異常/錯誤的有效方法嗎?
...
if (pk == null || rk == null) return null;
try
{
var item = repo.GetPkRk(pk, rk);
return (T)item;
}
catch (Exception ex)
{
throw new ServiceException("", typeof(T).Name + rk + " data retrieval error");
}
...
的ServiceException類:
public class ServiceException : ApplicationException {
public Dictionary<string, string> Errors { get; set; }
public ServiceException() : this(null) {}enter code here
public ServiceException(string key, string message)
{
Errors = new Dictionary<string, string>();
Errors.Add(key, message);
}
public ServiceException(Exception ex)
: base("Service Exception", ex)
{
Errors = new Dictionary<string, string>();
}
}
的錯誤信息,那麼夾在我的控制器:
catch (Exception e) { log(e); }
最後在日誌方法中處理:
protected void log(Exception ex)
{
if (ex is ServiceException)
{
ModelState.Merge(((ServiceException)ex).Errors);
} else {
Trace.Write(ex);
ModelState.AddModelError("", "Database access error: " + ex.Message);
}
}
任何人都可以評論,如果這是一個好方法或壞方法。之前我有一個關於捕捉內部異常的評論。這是可能的,如果是這樣,然後我怎麼可以捕捉並保留內部異常細節。
更新1
我修改的異常類,以便有一個構造函數前。不知道這個理想,但我認爲它的工作原理。任何更多的建議,如何改善將不勝感激。下面
更新2
代碼失敗,提示信息說
Error 2 Property or indexer 'System.Exception.InnerException' cannot be assigned to -- it is read only
我不知道如何解決這個問題。
public class ServiceException : ApplicationException {
public Dictionary<string, string> Errors { get; set; }
public ServiceException() : this(null) {}
public ServiceException(Exception ex, string key, string message)
{
Errors = new Dictionary<string, string>();
InnerException = ex;
Errors.Add(key, message);
}
public ServiceException(string key, string message)
{
Errors = new Dictionary<string, string>();
Errors.Add(key, message);
}
public ServiceException(Exception ex)
: base("Service Exception", ex)
{
Errors = new Dictionary<string, string>();
}
}
請參閱答案。我修改了它。 – 2011-12-24 06:32:13
不要從'ApplicationException'派生:http:// stackoverflow。com/questions/52753/should-i-derived-custom-exceptions-from-exception-or-applicationexception-in-net,http://blogs.msdn.com/b/kcwalina/archive/2006/06/23/ 644822.aspx – 2011-12-24 08:04:32