我已经编写了我最初认为的通用方法执行器和错误处理程序,用于我将来添加或可能添加的任何方法,但经过数小时的挣扎和谷歌搜索,我已经诉诸论坛。
目标:尝试远离方法中的单个错误处理,并在一个方法中处理所有错误。 (希望这是有道理的)。
通用方法执行程序和错误处理程序的代码:
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>
希望这是有道理的。
谢谢你。 查尔斯答案 0 :(得分:1)
您可以将LoadQuestions
的每次通话都包含在自己对ExecuteAndHandleAnyErrors
的调用中。
但是,这似乎缺少了异常处理的一部分。当使用异常来传达错误时,通常不会在一种方法中处理所有错误&#34;。一种方法通常不能明智地处理任何可能的异常。例如,您的方法可以处理ThreadAbortedException
吗? ArgumentException
怎么样?也不会在整个地方添加大量try ... catch
块。
通常,当代码可以合理地处理失败时,尝试编写处理特定异常的try ... catch
块(例如,在您打开文件的位置附近捕获FileNotFoundException
并触发对话框或尝试在不同的路径打开默认文件。)
通常,应用程序在try ... catch
中会有一个顶级Main()
块来记录任何其他未处理的异常。然后它重新抛出异常/崩溃程序/退出程序。
答案 1 :(得分:0)
我解决了。 我正在做的是看到第一次抛出异常,而不是按F10进一步下降。
感谢所有帮助