C#异常处理的一些经验和技巧

 更新时间:2014年03月20日 11:46:27   作者:  
本文是异常处理经验性的文章,其实跟C#关系也不大。比较适合刚刚熟悉异常语法,而缺乏实战的读者。当然,经验老练的读者也可指出不足、给予意见、补充说明,一起完善文章,分享更多知识与经验

1、什么时候该异常处理?
1)代码最外层,如WinFrom,避免用户看到内部异常信息用户体验不好,或者造成程序崩溃。
2)遇到异常需要恢复状态或者重试的地方。例如连接数据库偶然失败了,可以有个重连机制,在Catch块重新连接数据库。
3)对于一系列有可能失败的任务,其中有一个任务失败,不想影响到其他任务。例如要上传100张图片,不想因为一张图片上传发生异常而失败,进而终止整个上传任务,仅需要记录下失败的图片,提醒用户重传即可。
2、异常处理需要注意的地方
1)Catch和Finally代码应该非常短,而且成功率极高,避免自己又抛出一个异常。否则CLR会终止进程,避免安全漏洞或者不可预知的后果。这个类似于Windows蓝屏,发生了严重的错误,宁愿使系统不可用。
2)Catch块尽量避免直接捕捉异常的基类Exception,而应该捕捉具体的异常类。
3、异常处理的方法和技巧
1)是否能构建统一的框架处理异常,而不用手工来处理呢?
有的人可能会问,能不能偷懒,在一个地方处理异常就行了。如果仅仅是记录异常系统信息,通知到用户,而且这些信息通常是可以缺少一些上下文的,是可以构建同一的机制记录异常信息的。

例如:
WinFrom的Application对象本身就提供了ThreadException时间来捕捉为处理的异常

复制代码 代码如下:

static void Main()
    {
      //注册捕捉异常事件
      Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(new Form1());
    }
    static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
    {
      Exception ex = e.Exception;
      //做一些极其简单的记录异常信息操作
    }

又例如:
WebFrom的Global.asax本身就已经定义了void Application_Error(object sender, EventArgs e) 来处理异常
复制代码 代码如下:

void Application_Error(object sender, EventArgs e)
    {
      // 在出现未处理的错误时运行的代码
      Exception ex = Server.GetLastError();
      //处理完异常后清除异常
      Server.ClearError();
    }

但是很多时候,异常处理,不仅仅只是记录到了错误信息就可以了,有时候是需要失败重试或者清理资源等等,因此,仅仅靠统一构建异常处理框架是不够灵活的,因此可以一方面统一处理,另外一方面特殊的地方可以另外处理。

相关文章

  • C# try catch代码块不起效果的解决方法

    C# try catch代码块不起效果的解决方法

    本文主要介绍了C# try catch代码块不起效果的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • user32.dll 函数说明小结

    user32.dll 函数说明小结

    这篇文章主要介绍了user32.dll 函数说明,需要的朋友可以参考下
    2018-06-06
  • C#实现剪刀石头布游戏

    C#实现剪刀石头布游戏

    这篇文章主要为大家详细介绍了C#实现剪刀石头布游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • Unity Shader相交算法实现简易防能量盾

    Unity Shader相交算法实现简易防能量盾

    这篇文章主要为大家详细介绍了Unity Shader相交算法实现简易防能量盾,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C#使用CallContext缓存线程数据

    C#使用CallContext缓存线程数据

    这篇文章介绍了C#使用CallContext缓存线程数据的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C# WPF实现播放音频文件的示例详解

    C# WPF实现播放音频文件的示例详解

    这篇文章主要为大家详细介绍了利用C# WPF实现播放音频文件的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • c#中的浮点型转整形的舍取 四舍五入和银行家舍入实现代码

    c#中的浮点型转整形的舍取 四舍五入和银行家舍入实现代码

    c#中的浮点型转整形的舍取 四舍五入和银行家舍入实现代码,学习c#的朋友可以参考下
    2012-03-03
  • c#数据类型基础

    c#数据类型基础

    C#里面的数据类型分为两种:值类型和引用类型。
    2008-08-08
  • Unity UGUI的StandaloneInputModule标准输入模块组件使用示例

    Unity UGUI的StandaloneInputModule标准输入模块组件使用示例

    这篇文章主要为大家介绍了Unity UGUI的StandaloneInputModule标准输入模块组件使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • C#知识整理

    C#知识整理

    本文主要介绍了C#的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02

最新评论