大家好,我正在考虑将方法 block 作为参数传递给内置异常处理的帮助程序类,但这是直观的事情之一,我想提交它以供批评、见解或建议。
我想预先指出,这不是我进行所有异常处理的方式,但在某些情况下我发现这种结构更“可读”。
例如,我有一个场景,我正在显示预览图像,但如果失败(这是我正在预览图像的真实场景,并且无法预览某些 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
或 MissingMethodException
。
关于c# - C# 中异常的高阶函数方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1603798/