大家好,我想各地传递方法块作为参数传递给该建在异常处理的辅助类,但它的那些东西一个是直观的,我想将其提交批评,见解或建议。高阶函数法
我想指出了前面,这是不是我怎么做我所有的异常处理,但也有在那里我发现这种结构更多的情况下“可读性”。
例如,我有一个场景,我正在显示预览图像,但如果失败(这是一个真实场景,我正在预览图像,某些GIF/BMP格式无法预览),这只是一个场景,我显示替代图像而不是预览。在try/catch代码块,看起来像这样:
try
{
alternatePreviewImage.SetSource(fs);
}
catch (Exception ex) {
requiresSpecialPreview = false;
previewImage = new BitmapImage(new Uri("Images/NoPreviewAvailable.png", UriKind.Relative));
}
所以我会利用一个辅助类,需要一个方法参数,使它看起来像这样:
if(!ErrorHelper.RunWithSuccessNotify(()=> alternatePreviewImage.SetSource(fs))){
requiresSpecialPreview = false;
previewImage = new BitmapImage(new Uri("Images/NoPreviewAvailable.png", UriKind.Relative));
}
的ErrorHelper.RunWithSuccessNotify是很简单:
public static bool RunWithSuccessNotify(Action code) {
bool success = true;
try
{
code();
}
catch (Exception ex)
{
success = false;
}
return success;
}
让我再次强调,这是对这些低撞击场景,以及在那里我也许能抑制异常有用的人:
public static void RunWithErrorSuppression(Action code) {
try
{
code();
}
catch (Exception ex)
{
// pass
}
}
该方法可以更细致也允许捕获异常:
public static void ExecuteWithLogging(Action code, Action<Exception> handles) {
try
{
code();
}
catch (Exception ex)
{
handles(ex);
}
}
那么,什么是这套战术的集中异常处理的想法?如果这是一个糟糕的方向,有什么具体原因可能导致我陷入麻烦?
小细节:除非您自己抛出,否则在近期版本的框架中无法捕捉到'StackOverflowException'。 – Joren 2009-10-21 21:46:35
您可以在其中指定预期异常的通用版本 – 2009-10-21 21:50:54
Vinko的好处,尽管我仍然没有看到该解决方案如何更易于维护,表达,可读或高性能。 (是的,我故意将性能放在最后。) – Lee 2009-10-21 22:05:12