方法2是可能的。如果你總是期待同樣的例外,我會推薦它。
如果被調用的方法可以拋出非常特定的異常,那麼可能會更好地處理它們靠近拋出的位置。
可以定義一個包裝方法以捕獲異常這樣的:
public bool TryExecuteServiceAction(Action a) {
if (a == null) {
throw new ArgumentNullException("a");
}
try {
a();
return true;
}
catch (SecurityAccessDeniedException sade) {
Logger.Error(sade);
return false;
}
}
通過返回ResultObject
包含錯誤碼,消息等而不是返回bool
將此模式擴展。
使用這樣
DoSomethingDto serviceResult = null;
var success = TryExecuteServiceAction(() => serviceResult = _service.DoSomething(command));
if (success) {
// we know that the service call was successful and the DTO has data
// work with DTO ...
}
else {
// e.g. show generic error message to user
}
該包裝將是一個非常糟糕的主意。一般來說,例外需要特定的處理。所以如果你發現了一個'NullReferenceException',你會在處理程序中做什麼?你不知道如何恢復。唯一可能有用的是一個非常通用的錯誤信息(即「發生錯誤,抱歉」)或記錄。 – DavidG
使用第三個選項:在最低級別添加try-catch,並在那裏處理您的一般例外。 – Maarten