美文网首页C#
用委托封装C#的Try...Catch

用委托封装C#的Try...Catch

作者: 天兵公园 | 来源:发表于2017-07-12 18:30 被阅读37次

开发软件过程中,为了防止程序崩溃出错都会用 try ... catch 包裹住会产生异常的代码。随着项目越来越大,try ... catch 语句到处都是,令人眼花的花括号,丑陋无比的缩进让人崩溃。

IO 操作通常最容易引发异常,文件读写网络访问数据库操作这些,比如读取当前目录的文本:

string text = System.IO.File.ReadAllText("demo.txt");
Console.WriteLine(text);
IO 异常

这时就需要在外层用 try ... catch 将这两行代码包括起来,并提示错误:

try
{
    string text = System.IO.File.ReadAllText("demo.txt");
    Console.WriteLine(text);
}
catch (System.IO.IOException ex)
{
    Console.WriteLine(ex.Message);
}

为了简化上面的代码结构,在这里我们可以设计一个静态方法,将需要执行的代码作为参数,在 try ... catch 里执行它。如何将要执行的代码作为参数传给另外一个方法呢,我们可以用 Action<T> 和 Fun<T> 委托,他们一个是无返回参数,一个是有返回参数。

public static void Try(Action act, Action<Exception> errorCallback = null)
{
    try
    {
        act();
    }
    catch (Exception ex)
    {
        errorCallback?.Invoke(ex);
    }
}

这个 Try 方法接受两个委托作为参数,第一个是要执行的代码,第二个是出现了异常也好返回一个 Exception 类型给调用方,并且它是一个可为 null 类型的参数,也就是可选参数。

把这个方法放到一个静态类 TryCatch 里,在调用的类使用 using 语句使用这个静态类,没错,C# 6 就是这么叼。

using static TryCatch;

改造后的语句:

string text = "";
Try(() =>
{
    text = System.IO.File.ReadAllText("demo.txt");
}, error =>
{
     WriteLine(error.Message);
});

这里就很厉害了,代码竟然没有变短反而变长了和更难理解了。

继续改造,使用 Func<T>:

public static T Try<T>(Func<T> func, Func<Exception, T> errorCallback = null)
{
    try
    {
        return func();
    }
    catch (Exception ex)
    {
        if (errorCallback != null)
        {
            return errorCallback(ex);
        }
        return default(T);
    }
}

再继续改造刚才的代码:

string text = Try(()=> { return System.IO.File.ReadAllText("demo.txt"); });
WriteLine(text);

震惊!某知名函数竟然不报错,原因竟然是这:

return default(T);

很好理解,就是返回默认值了。

可以在那两个静态类里加入 logger,这样每一个 try ... catch 报错都可以记录下来,同理还可以对实现了 IDispose 接口的类封装,省略 using 代码块。

本文在依然在 天兵公园 公众号,博客简书 同步发布,转载前务必联系

相关文章

  • 用委托封装C#的Try...Catch

    开发软件过程中,为了防止程序崩溃出错都会用 try ... catch 包裹住会产生异常的代码。随着项目越来越大,...

  • C# 委托

    C#委托 C#中的委托(Delegate)类似于C或C++中函数的指针。委托(Delegate)是存有对某个方法的...

  • 教小明学一点点编程—C#篇(0)

    像小明这样使用C#的新同学,一定都会被C#的复杂的委托事件机制所困惑,那么我们不如解释一下什么是C#中委托。 委托...

  • C#委托 匿名函数 Lambda

    C# 中委托的发展#在 C# 1.0 中,通过使用在代码中其他位置定义的方法显式初始化委托来创建委托的实例。 C#...

  • (转).NET面试题系列[7] - 委托与事件

    委托和事件 委托在C#中具有无比重要的地位。 C#中的委托可以说俯拾即是,从LINQ中的lambda表达式到(包括...

  • 2020-02-19

    C# 委托 (一)—— 委托、 泛型委托与Lambda表达式 原创wnvalentin 最后发布于2018-08-...

  • C#匿名方法、Lambda表达式和各种泛型委托

    Linq查询与高级C#编程机器理论研究基础 C#委托解决的是对象之间的逆向传递问题,其次,委托还有其他的用途(匿名...

  • C# 基础知识系列- 11 委托和事件

    0. 前言 事件和委托是C#中的高级特性,也是C#中很有意思的一部分。出现事件的地方,必然有委托出现;而委托则不一...

  • C#中的委托是用来干嘛的

    在C#中我们会听到一个概念——委托。那么委托是个什么鬼,用来干嘛的呢?最近有些空闲时间就写一下C#中委托相关的知识...

  • C#委托Delegate和事件Event实战应用

    一、委托的概念 C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。委托(Delegate)是...

网友评论

    本文标题:用委托封装C#的Try...Catch

    本文链接:https://www.haomeiwen.com/subject/iwobhxtx.html