2013-11-27 51 views
0

我已經寫了我最初的想法是爲我添加或可能在未來但許多小時的奮力和谷歌上搜索後添加任何方法的泛型方法執行器和錯誤處理程序,我已經使出去到論壇。單方法執行器和錯誤處理程序

目的:試圖讓個別錯誤處理掉的方法,以及如何在一個單一的方法的所有錯誤。 (希望這是有道理的)。

規範通用方法執行器和錯誤處理程序:

internal static Tuple<SystemMessage, object> ExecuteAndHandleAnyErrors<T,TArg1>(this object callingMethod, params object[] args) 
    { 
     dynamic methodToExecute; 

     if (callingMethod.GetType() == typeof(Func<T, TArg1>)) 
     { 
      methodToExecute = (callingMethod as Func<T,TArg1>); 
     } 
     else 
     { 
      methodToExecute = (callingMethod as Action<T, TArg1>); 
     } 

     try 
     { 
      var result = methodToExecute.DynamicInvoke(args); 
      return new Tuple<SystemMessage, object>(null,result); 
     } 
     catch (Exception ex) 
     { 
      return new Tuple<SystemMessage, object>(new SystemMessage 
      { 
       MessageText = ex.Message, 
       MessageType = SystemMessage.SystemMessageType.Error 
      }, null); 
     } 
    } 

//This is the code for a sample method: 

internal QuestionAnswerSet LoadQuestions(DataWrapper dataWrapper) 
{ 
    var taskExecuter = new Func<DataWrapper, QuestionAnswerSet> (InternalDeserializeObject<QuestionAnswerSet>); 

    var questionAnswerSet = taskExecuter.ExecuteAndHandleAnyErrors<DataWrapper, QuestionAnswerSet>(dataWrapper);   

    return questionAnswerSet.Item2 as QuestionAnswerSet; 
} 

我的問題是:是否有可能,如果LoadQuestions方法倒下,我該如何捕獲錯誤和延遲錯誤處理的ExecuteAndHandleAnyErrors方法沒有手動添加try ... catch語句到LoadQuestions方法?

希望這是有道理的。

感謝ü。 查爾斯

+0

看起來相當複雜。我使用lambda表達式做同樣的事情:'ExecuteAndHandleAnyErrors'具有唯一的參數'Action',並且將任何寫在lambda體中的代碼傳遞給它。 –

+1

嗯,它應該可以工作,除了它會隱藏你想在'TargetInvocationException'裏捕獲的異常。你必須得到內在的例外才能得到「真正的」。 – Luaan

回答

1

您可以在自己的電話ExecuteAndHandleAnyErrors中打包每個電話LoadQuestions

然而,這似乎缺少異常處理的點的一部分。當使用異常來傳達錯誤時,通常不會「用一種方法處理所有錯誤」。這種單一的方法通常不能明智地處理任何可能的例外。例如,你的方法可以處理ThreadAbortedException?那麼ArgumentException呢?也沒有增加很多try ... catch塊遍佈各地。

在一般情況下,嘗試寫try ... catch塊處理特定的異常時,你的代碼可以理智地處理故障(例如,捕捉FileNotFoundException,你打開一個文件附近,觸發一個對話框,或嘗試在不同的打開一個默認的文件路徑)。

通常,應用程序通常會在Main()中有一個頂級try ... catch塊來記錄任何其他未處理的異常。然後重新拋出異常/崩潰程序/退出程序。

0

我解決它。 我在做什麼是看到第一次拋出異常,並沒有按F10進一步下降。

THANKs for all the help