单个方法执行器和错误处理程序

时间:2013-11-27 07:29:59

标签: c# .net

我已经编写了我最初认为的通用方法执行器和错误处理程序,用于我将来添加或可能添加的任何方法,但经过数小时的挣扎和谷歌搜索,我已经诉诸论坛。

目标:尝试远离方法中的单个错误处理,并在一个方法中处理所有错误。 (希望这是有道理的)。

通用方法执行程序和错误处理程序的代码:

    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方法而不手动向loadQuestions方法添加try ... catch语句?< / p>

希望这是有道理的。

谢谢你。 查尔斯

2 个答案:

答案 0 :(得分:1)

您可以将LoadQuestions的每次通话都包含在自己对ExecuteAndHandleAnyErrors的调用中。

但是,这似乎缺少了异常处理的一部分。当使用异常来传达错误时,通常不会在一种方法中处理所有错误&#34;。一种方法通常不能明智地处理任何可能的异常。例如,您的方法可以处理ThreadAbortedException吗? ArgumentException怎么样?也不会在整个地方添加大量try ... catch块。

通常,当代码可以合理地处理失败时,尝试编写处理特定异常的try ... catch块(例如,在您打开文件的位置附近捕获FileNotFoundException并触发对话框或尝试在不同的路径打开默认文件。)

通常,应用程序在try ... catch中会有一个顶级Main()块来记录任何其他未处理的异常。然后它重新抛出异常/崩溃程序/退出程序。

答案 1 :(得分:0)

我解决了。 我正在做的是看到第一次抛出异常,而不是按F10进一步下降。

感谢所有帮助