关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » .NET »反思你写的Try…Catch真的有必要么?

    反思你写的Try…Catch真的有必要么?

    2015-09-13 00:00:00 出处:张博
    分享

    很多人喜欢用Try…Catch把每一个方法都包裹起来,可是真的有必要么?

    为什么要这样做?我估计是大家被BUG吓怕了,生怕生产环境出现各种莫名其妙的错误,比如最经典的NullReferenceException,可问题是你用Try…Catch包裹起来后错误是不会爆出来了,但是执行结果是你想要的么?恐怕bug还在那里,只是经过你的Try…Catch之后,bug更加难找了,原本你用vs调试起来,直接就断在了异常发生的地方,现在呢?你得一步步跟踪过去。

    这不是最主要的问题,最重要的问题是你在开发过程中隐藏了bug,如果当时你没加这个Try…Catch,恐怕你早就发现这个bug了,因为程序压根就跑不下去。

    异常信息应该由最上层的框架捕获,比如MVC中有ExceptionFilter,你可以在这里记录详细日志,别把黄页抛给用户就可以了。我想写一个Try…Catch的场景,但是居然一下子想不出来一个很好的场景,因为真真需要写Try…Catch的场景是很少的,你一旦想写Try…Catch,首先想想你是不是在故意隐瞒Bug.

    反而我鼓励大家写Throw exception,比如这种场景:

    public void Register(string userName,string password)
     {
         if(string.IsNullOrEmpty(userName))
             throw new InvalidDataException("user name can not be empty");
         if(string.IsNullOrEmpty(password))
             throw new InvalidDataException("password can not be empty");
         //....
     } 
    
     public void Register(string userName,string password)
     {
         try
         {
             //....
         }
         catch (Exception)
         {
    
         }
     }

    理论上,虽然UI做了各种校验,我们写的Register任然保持对参数的不信任,继续抛异常而不是Try..Catch,这样你是不是能提前发现UI没有校验的bug呢?

    追加内容:很多同学对此文的结论难以接受,最有疑问的就是“Try…catch可以记录日志,捕获异常的详细信息,不会让程序挂掉”, 我需要重申的是:Try…Catch的作用不是用来记录日志的,任何框架都在顶层提供了捕捉异常的方案:

    以.NET为例:

    1. Winform,可以:

    AppDomain.CurrentDomain.UnhandledException +=new UnhandledExceptionEventHandler(UnhandledExceptionFunction);

    2. Asp.net,可以在Application_Error()方法里捕获异常

    3. MVC,可以写ExceptionFilter

    4. WebApi,可以写ExceptionHandler

    这里面拿到的Exception都是带整个Stack记录的,你可以用Log4记录下来,并不是有的同学说的只会拿到e.message这样

    建议:少写Try…Catch,喜欢写Try…Catch的朋友注意:你那90%的Try…Catch都是没必要的

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    帝国CMS7.5编辑器上传图片取消宽高的三种方法

    帝国cms如何自动生成缩略图的实现方法

    Windows 12即将到来,将彻底改变人机交互

    帝国CMS 7.5忘记登陆账号密码怎么办?可以phpmyadmin中重置管理员密码

    帝国CMS 7.5 后台编辑器换行,修改回车键br换行为p标签

    Windows 11 版本与 Windows 10比较,新功能一览

    Windows 11激活产品密钥收集及专业版激活方法

    如何从 Windows 11 中完全删除/卸载 OneNote?无解!

    抖音安全与信任开放日:揭秘推荐算法,告别单一标签依赖

    ultraedit编辑器打开文件时,总是提示是否转换为DOS格式,如何关闭?

    IT头条

    华为Pura80系列新机预热,余承东力赞其复杂光线下的视频拍摄实力

    01:28

    阿里千问3开源首战告捷:全球下载破千万,国产AI模型崛起新高度!

    01:22

    DeepSeek R1小版本试升级:网友实测编程能力已达到国际一线水平

    23:15

    NVIDIA 与 Dell 合作,大规模交付 Blackwell AI 系统

    20:52

    Cerebras 以最快的 Llama 4 Maverick 性能引领 LLM 推理竞赛

    20:51

    技术热点

    PHP中的随机性——你觉得自己幸运吗?

    搞定Ubuntu Linux下WPA无线上网

    Java使用内存映射实现大文件的上传

    MySQL安全性指南

    MySQL两项性能的基本测试浅谈

    教您使用UniqueIdentifier选取SQL Server主键

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。